public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); sync = new Sync(callable); } private final class Sync extends AbstractQueuedSynchronizer { Sync(Callable<V> callable) { this.callable = callable; } } public V get() throws InterruptedException, ExecutionException { return sync.innerGet(); } V innerGet() throws InterruptedException, ExecutionException { acquireSharedInterruptibly(0); if (getState() == CANCELLED) throw new CancellationException(); if (exception != null) throw new ExecutionException(exception); return result; }
@Test(expected = CPUReactiveAuditException.class) public void acquireSharedInterruptibly() throws InterruptedException { TestTools.strict.commit(); c.acquireSharedInterruptibly(1); } }
class BooleanLatch { private static class Sync extends AbstractQueuedSynchronizer { boolean isSignalled() { return getState() != 0; } protected int tryAcquireShared(int ignore) { return isSignalled()? 1 : -1; } protected boolean tryReleaseShared(int ignore) { setState(1); return true; } } private final Sync sync = new Sync(); public boolean isSignalled() { return sync.isSignalled(); } public void signal() { sync.releaseShared(1); } public void await() throws InterruptedException { sync.acquireSharedInterruptibly(1); } }
throws InterruptedException sync.acquireSharedInterruptibly(1);
throws InterruptedException sync_.acquireSharedInterruptibly(0);
public void lock() { sync.acquireShared(group); } public void lockInterruptibly() throws InterruptedException { sync.acquireSharedInterruptibly(group);