1 30 31 package rcm.util; 32 33 import java.util.Vector ; 34 35 public class Timer { 36 37 int interval; 38 boolean periodic; 39 boolean isExpired = false; 40 41 static TimerManager manager = new TimerManager (); 42 long deadline; 43 Timer next, prev; 44 45 public Timer () { 46 } 47 48 public void set (int msecDelay, boolean periodic) { 49 interval = msecDelay; 50 this.periodic = periodic; 51 isExpired = false; 52 if (!manager.isAlive ()) { 53 System.err.println ("TimerManager: restarting"); 54 manager = new TimerManager (); 55 } 56 manager.register (this, System.currentTimeMillis () + msecDelay); 57 } 58 59 public int getInterval () { 60 return interval; 61 } 62 63 public boolean getPeriodic () { 64 return periodic; 65 } 66 67 public void cancel () { 68 manager.delete (this); 69 } 70 71 protected void alarm () { 72 } 73 74 public boolean expired () { 75 return isExpired; 76 } 77 78 88 } 89 90 class TimerManager extends Thread { 91 Timer first, last; 92 93 101 102 public TimerManager () { 103 super ( "Timer Manager"); 104 setDaemon (true); 105 start (); 106 } 107 108 public synchronized void register (Timer t, long deadline) { 109 t.deadline = deadline; 110 delete (t); 112 insertion: 114 { 115 for (Timer u = first; u != null; u = u.next) { 116 if (t.deadline < u.deadline) { 117 if (u.prev != null) 118 u.prev.next = t; 119 else 120 first = t; 121 t.prev = u.prev; 122 t.next = u; 123 u.prev = t; 124 break insertion; 125 } 126 } 127 if (last != null) { 128 last.next = t; 129 t.prev = last; 130 t.next = null; 131 last = t; 132 } else { 133 first = last = t; 134 } 135 } 136 137 notifyAll (); 139 } 140 141 public synchronized void delete (Timer t) { 142 if (t.next != null) 143 t.next.prev = t.prev; 144 if (t.prev != null) 145 t.prev.next = t.next; 146 if (t == last) 147 last = t.prev; 148 if (t == first) 149 first = t.next; 150 t.next = null; 151 t.prev = null; 152 } 153 154 static final int FOREVER = 60000; 156 public synchronized void run () { 157 while (true) { 158 try { 159 if (first == null) { 161 wait (FOREVER); 163 } 165 else { 166 Timer t = first; 167 long now = System.currentTimeMillis (); 168 if (t.deadline <= now) { 169 try { 171 t.isExpired = true; 172 t.alarm (); 173 } catch (Throwable e) { 174 if (e instanceof ThreadDeath ) 175 throw (ThreadDeath )e; 176 else 177 e.printStackTrace (); 178 } 179 if (t.periodic) { 180 register (t, now + t.interval); 181 } 182 else { 183 delete (t); 184 } 185 } 186 else { 187 wait (t.deadline - now); 189 } 191 } 192 } catch (InterruptedException e) {} 193 } 194 } 195 } 196 197 211 | Popular Tags |