001: /*
002: * <copyright>
003: *
004: * Copyright 1997-2007 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026: /*
027: File: EDU/oswego/cs/dl/util/concurrent/FutureResult.java
028:
029: Originally written by Doug Lea and released into the public domain.
030: This may be used for any purposes whatsoever without acknowledgment.
031: Thanks for the assistance and support of Sun Microsystems Labs,
032: and everyone contributing, testing, and using this code.
033:
034: History:
035: Date Who What
036: 30Jun1998 dl Create public version
037: */
038: package org.cougaar.util;
039:
040: // CHANGES:
041: // - Changed package to "org.cougaar.util"
042: // - Changed code style (e.g. use braces)
043: // - Changed javadoc
044: // - Made TimeoutException a static inner class
045:
046: import java.lang.reflect.InvocationTargetException;
047:
048: /**
049: * A container that allows one thread to wait for the processing
050: * result of a parallel thread.
051: * <p>
052: * Typically one thread calls "get()" to block for the result, and another
053: * thread, possibly queued, does the work and eventually calls "set(...)"
054: * to unblock the waiter.
055: * <p>
056: * This is a copy of Doug Lea's public domain "FutureResult" class:<br>
057: * EDU/oswego/cs/dl/util/concurrent/FutureResult.java<br>
058: * For some reason it was not included in JDK 1.5's "java.util.concurrent"
059: * package.
060: */
061: public class FutureResult {
062:
063: protected Object value_ = null;
064: protected boolean ready_ = false;
065: protected InvocationTargetException exception_ = null;
066:
067: public FutureResult() {
068: }
069:
070: /** Wait until the result is ready and get it */
071: public synchronized Object get() throws InterruptedException,
072: InvocationTargetException {
073: while (!ready_) {
074: wait();
075: }
076: return doGet();
077: }
078:
079: /**
080: * Wait at most "msecs" milliseconds for the result, otherwise
081: * throw a TimeoutException.
082: */
083: public synchronized Object timedGet(long msecs)
084: throws TimeoutException, InterruptedException,
085: InvocationTargetException {
086: if (ready_)
087: return doGet();
088: if (msecs <= 0)
089: throw new TimeoutException(msecs);
090: long startTime = System.currentTimeMillis();
091: long waitTime = msecs;
092: while (true) {
093: wait(waitTime);
094: if (ready_)
095: return doGet();
096: waitTime = msecs - (System.currentTimeMillis() - startTime);
097: if (waitTime <= 0)
098: throw new TimeoutException(msecs);
099: }
100: }
101:
102: /** Set a non-exception result and notify the waiters */
103: public synchronized void set(Object newValue) {
104: value_ = newValue;
105: ready_ = true;
106: notifyAll();
107: }
108:
109: /** Set an exception result and notify the waiters. */
110: public synchronized void setException(Throwable ex) {
111: exception_ = new InvocationTargetException(ex);
112: ready_ = true;
113: notifyAll();
114: }
115:
116: public synchronized boolean isReady() {
117: return ready_;
118: }
119:
120: public synchronized Object peek() {
121: return value_;
122: }
123:
124: public synchronized InvocationTargetException getException() {
125: return exception_;
126: }
127:
128: public synchronized void clear() {
129: value_ = null;
130: exception_ = null;
131: ready_ = false;
132: }
133:
134: protected Object doGet() throws InvocationTargetException {
135: if (exception_ != null)
136: throw exception_;
137: return value_;
138: }
139:
140: public static class TimeoutException extends InterruptedException {
141: private final long duration;
142:
143: public TimeoutException(long time) {
144: duration = time;
145: }
146:
147: public TimeoutException(long time, String message) {
148: super (message);
149: duration = time;
150: }
151:
152: public long getDuration() {
153: return duration;
154: }
155: }
156: }
|