Mercurial > hg > blitz_condensed
diff src/EDU/oswego/cs/dl/util/concurrent/TimeoutSync.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/EDU/oswego/cs/dl/util/concurrent/TimeoutSync.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,69 @@ +/* + File: TimeoutSync.java + + Originally written by Doug Lea and released into the public domain. + This may be used for any purposes whatsoever without acknowledgment. + Thanks for the assistance and support of Sun Microsystems Labs, + and everyone contributing, testing, and using this code. + + History: + Date Who What + 1Aug1998 dl Create public version +*/ + +package EDU.oswego.cs.dl.util.concurrent; + +/** + * A TimeoutSync is an adaptor class that transforms all + * calls to acquire to instead invoke attempt with a predetermined + * timeout value. + *<p> + * <b>Sample Usage</b>. A TimeoutSync can be used to obtain + * Timeouts for locks used in SyncCollections. For example: + * <pre> + * Mutex lock = new Mutex(); + * TimeoutSync timedLock = new TimeoutSync(lock, 1000); // 1 sec timeouts + * Set set = new SyncSet(new HashSet(), timedlock); + * try { + * set. add("hi"); + * } + * // SyncSets translate timeouts and other lock failures + * // to unsupported operation exceptions, + * catch (UnsupportedOperationException ex) { + * System.out.println("Lock failure"); + * } + * </pre> + * + * <p>[<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>] + * @see Sync +**/ + + +public class TimeoutSync implements Sync { + + protected final Sync sync_; // the adapted sync + protected final long timeout_; // timeout value + + /** + * Create a TimeoutSync using the given Sync object, and + * using the given timeout value for all calls to acquire. + **/ + + public TimeoutSync(Sync sync, long timeout) { + sync_ = sync; + timeout_ = timeout; + } + + public void acquire() throws InterruptedException { + if (!sync_.attempt(timeout_)) throw new TimeoutException(timeout_); + } + + public boolean attempt(long msecs) throws InterruptedException { + return sync_.attempt(msecs); + } + + public void release() { + sync_.release(); + } + +}