1 19 package org.netbeans.modules.tasklist.usertasks.model; 20 21 import java.util.Iterator ; 22 import java.util.LinkedList ; 23 import java.util.ListIterator ; 24 import java.util.Vector ; 25 26 32 public class TimeoutProvider implements Runnable { 33 34 private class Entry { 35 40 public Entry(Timeout owner, Object userRef, long timeout) { 41 this.owner = owner; 42 this.userRef = userRef; 43 this.timeout = timeout; 44 } 45 46 public Timeout owner; 47 48 public Object userRef; 49 50 public long timeout; 51 } 52 53 57 private TimeoutProvider() { 58 alarms = new LinkedList <Entry>(); 59 alarms.add(new Entry(null, null, Long.MAX_VALUE)); 60 61 thread = new Thread (this, "TimeoutProvider"); thread.start(); 63 } 64 65 69 public static TimeoutProvider getInstance() { 70 if (instance == null) { 71 instance = new TimeoutProvider(); 72 } 73 return instance; 74 } 75 76 82 public void cancel(Timeout owner, Object userRef) { 83 synchronized (alarms) { 84 ListIterator i = alarms.listIterator(0); 85 86 while (i.hasNext()) { 87 Entry e = (Entry)i.next(); 88 89 if (owner.equals(e.owner)) { 90 if (userRef == null || e.userRef.equals(userRef)) { 91 i.remove(); 92 } 93 } 94 } 95 } 96 97 thread.interrupt(); 98 } 99 100 106 public void add(Timeout owner, Object userRef, long timeout) { 107 synchronized (alarms) { 108 ListIterator i = alarms.listIterator(0); 109 boolean done = false; 110 int idx = 0; 111 112 while (!done && i.hasNext()) { 113 Entry e = (Entry)i.next(); 114 115 if (timeout < e.timeout) { 116 done = true; 117 } else { 118 ++idx; 119 } 120 } 121 122 alarms.add(idx, new Entry(owner, userRef, timeout)); 123 } 124 125 thread.interrupt(); 126 } 127 128 132 public void run() { 133 134 while (true) { 135 long nextTimeout; 137 synchronized (alarms) { 138 nextTimeout = ((Entry)alarms.get(0)).timeout; 139 } 140 long currentTime = System.currentTimeMillis(); 141 try { 142 long sleeptime = nextTimeout - currentTime; 143 if (sleeptime > 0) { 144 Thread.sleep(sleeptime); 145 } 146 147 Vector <Entry> vec = new Vector <Entry>(); 148 synchronized (alarms) { 149 ListIterator i = alarms.listIterator(0); 150 boolean done = false; 151 152 while (!done && i.hasNext()) { 153 Entry e = (Entry)i.next(); 154 155 if (e.timeout <= nextTimeout) { 156 vec.add(e); 160 i.remove(); } else { 162 done = true; 163 } 164 } 165 } 167 Iterator i = vec.iterator(); 168 while (i.hasNext()) { 169 Entry e = (Entry)i.next(); 172 e.owner.timeoutExpired(e.userRef); 173 } 174 175 } catch (InterruptedException e) { 176 } 178 } 179 } 180 181 182 private Thread thread; 183 184 private static TimeoutProvider instance; 185 186 private LinkedList <Entry> alarms; 187 } 188 | Popular Tags |