1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class ActiveQueue { ... public synchronized void enqueue(ClientRequest cr, long timeout) throws InterruptedException, TimeoutException { if (isFull ()) { // 判断队列是否为满 long start = System.currentTimeMillis (); long waitTime = timeout; for (;;) { // 一直等待到队列不满被notify通知或者超时 wait (waitTime); if (isFull ()) { //重新判断队列是否为满 long now = System.currentTimeMillis (); long timeSoFar = now - start; // 队列仍然为满,计算已经等待的时间 if (timeSoFar >= msecTimeout) // 如果超时,抛出TimeoutException异常 throw new TimeoutException (); else // 没有超时,计算还要等待的时间 waitTime = timeout - timeSoFar; } else // 被notify唤醒,并且队列不为满 break; } } // 把用户请求添加到处理队列中 notifyAll(); } ... } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public abstract class WaitWithTiming { // wait方法要作用的对象,对于上述例子就是ActiveQueue protected Object object_; public WaitWithTiming (Object obj) { object_ = obj; } // 这是一个抽象的hook方法,由具体的应用实现,该方法由本算法框架调用 public abstract boolean condition (); // 计算判断超时的算法框架实现 public final void timedWait (long timeout) throws InterruptedException, TimeoutException { if (condition ()) { //调用具体应用实现的hook方法 long start = System.currentTimeMillis (); long waitTime = msecTimeout; for (;;) { object_.wait (waitTime); if (condition ()) { long now = System.currentTimeMillis (); long timeSoFar = now - start; if (timeSoFar >= msecTimeout) throw new TimeoutException (); else waitTime = timeout - timeSoFar; } else break; } } } public final void announce() { object_.notifyAll (); } } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |