1 2 package ch.ethz.ssh2.util; 3 4 import java.io.PrintWriter ; 5 import java.io.StringWriter ; 6 import java.util.Collections ; 7 import java.util.LinkedList ; 8 9 import ch.ethz.ssh2.log.Logger; 10 11 22 public class TimeoutService 23 { 24 private static final Logger log = Logger.getLogger(TimeoutService.class); 25 26 public static class TimeoutToken implements Comparable 27 { 28 private long runTime; 29 private Runnable handler; 30 31 private TimeoutToken(long runTime, Runnable handler) 32 { 33 this.runTime = runTime; 34 this.handler = handler; 35 } 36 37 public int compareTo(Object o) 38 { 39 TimeoutToken t = (TimeoutToken) o; 40 if (runTime > t.runTime) 41 return 1; 42 if (runTime == t.runTime) 43 return 0; 44 return -1; 45 } 46 } 47 48 private static class TimeoutThread extends Thread 49 { 50 public void run() 51 { 52 synchronized (todolist) 53 { 54 while (true) 55 { 56 if (todolist.size() == 0) 57 { 58 timeoutThread = null; 59 return; 60 } 61 62 long now = System.currentTimeMillis(); 63 64 TimeoutToken tt = (TimeoutToken) todolist.getFirst(); 65 66 if (tt.runTime > now) 67 { 68 69 70 try 71 { 72 todolist.wait(tt.runTime - now); 73 } 74 catch (InterruptedException e) 75 { 76 } 77 78 82 83 continue; 84 } 85 86 todolist.removeFirst(); 87 88 try 89 { 90 tt.handler.run(); 91 } 92 catch (Exception e) 93 { 94 StringWriter sw = new StringWriter (); 95 e.printStackTrace(new PrintWriter (sw)); 96 log.log(20, "Exeception in Timeout handler:" + e.getMessage() + "(" + sw.toString() + ")"); 97 } 98 } 99 } 100 } 101 } 102 103 104 private static final LinkedList todolist = new LinkedList (); 105 106 private static Thread timeoutThread = null; 107 108 115 public static final TimeoutToken addTimeoutHandler(long runTime, Runnable handler) 116 { 117 TimeoutToken token = new TimeoutToken(runTime, handler); 118 119 synchronized (todolist) 120 { 121 todolist.add(token); 122 Collections.sort(todolist); 123 124 if (timeoutThread != null) 125 timeoutThread.interrupt(); 126 else 127 { 128 timeoutThread = new TimeoutThread(); 129 timeoutThread.setDaemon(true); 130 timeoutThread.start(); 131 } 132 } 133 134 return token; 135 } 136 137 public static final void cancelTimeoutHandler(TimeoutToken token) 138 { 139 synchronized (todolist) 140 { 141 todolist.remove(token); 142 143 if (timeoutThread != null) 144 timeoutThread.interrupt(); 145 } 146 } 147 148 } 149 | Popular Tags |