semaphoretest.java
来自「SRI international 发布的OAA框架软件」· Java 代码 · 共 927 行 · 第 1/3 页
JAVA
927 行
/*
* Written by Doug Lea with assistance from members of JCP JSR-166
* Expert Group and released to the public domain, as explained at
* http://creativecommons.org/licenses/publicdomain
* Other contributors include Andrew Wright, Jeffrey Hayes,
* Pat Fisher, Mike Judd.
*/
import junit.framework.*;
import edu.emory.mathcs.backport.java.util.*;
import edu.emory.mathcs.backport.java.util.concurrent.*;
import java.io.*;
import java.util.*;
public class SemaphoreTest extends JSR166TestCase {
public static void main(String[] args) {
junit.textui.TestRunner.run (suite());
}
public static Test suite() {
return new TestSuite(SemaphoreTest.class);
}
/**
* Subclass to expose protected methods
*/
static class PublicSemaphore extends Semaphore {
PublicSemaphore(int p, boolean f) { super(p, f); }
public Collection getQueuedThreads() {
return super.getQueuedThreads();
}
public void reducePermits(int p) {
super.reducePermits(p);
}
}
/**
* A runnable calling acquire
*/
class InterruptibleLockRunnable implements Runnable {
final Semaphore lock;
InterruptibleLockRunnable(Semaphore l) { lock = l; }
public void run() {
try {
lock.acquire();
} catch(InterruptedException success){}
}
}
/**
* A runnable calling acquire that expects to be
* interrupted
*/
class InterruptedLockRunnable implements Runnable {
final Semaphore lock;
InterruptedLockRunnable(Semaphore l) { lock = l; }
public void run() {
try {
lock.acquire();
threadShouldThrow();
} catch(InterruptedException success){}
}
}
/**
* Zero, negative, and positive initial values are allowed in constructor
*/
public void testConstructor() {
Semaphore s0 = new Semaphore(0, false);
assertEquals(0, s0.availablePermits());
assertFalse(s0.isFair());
Semaphore s1 = new Semaphore(-1, false);
assertEquals(-1, s1.availablePermits());
assertFalse(s1.isFair());
Semaphore s2 = new Semaphore(-1, false);
assertEquals(-1, s2.availablePermits());
assertFalse(s2.isFair());
}
/**
* Constructor without fairness argument behaves as nonfair
*/
public void testConstructor2() {
Semaphore s0 = new Semaphore(0);
assertEquals(0, s0.availablePermits());
assertFalse(s0.isFair());
Semaphore s1 = new Semaphore(-1);
assertEquals(-1, s1.availablePermits());
assertFalse(s1.isFair());
Semaphore s2 = new Semaphore(-1);
assertEquals(-1, s2.availablePermits());
assertFalse(s2.isFair());
}
/**
* tryAcquire succeeds when sufficient permits, else fails
*/
public void testTryAcquireInSameThread() {
Semaphore s = new Semaphore(2, false);
assertEquals(2, s.availablePermits());
assertTrue(s.tryAcquire());
assertTrue(s.tryAcquire());
assertEquals(0, s.availablePermits());
assertFalse(s.tryAcquire());
}
/**
* Acquire and release of semaphore succeed if initially available
*/
public void testAcquireReleaseInSameThread() {
Semaphore s = new Semaphore(1, false);
try {
s.acquire();
s.release();
s.acquire();
s.release();
s.acquire();
s.release();
s.acquire();
s.release();
s.acquire();
s.release();
assertEquals(1, s.availablePermits());
} catch( InterruptedException e){
unexpectedException();
}
}
/**
* Uninterruptible acquire and release of semaphore succeed if
* initially available
*/
public void testAcquireUninterruptiblyReleaseInSameThread() {
Semaphore s = new Semaphore(1, false);
try {
s.acquireUninterruptibly();
s.release();
s.acquireUninterruptibly();
s.release();
s.acquireUninterruptibly();
s.release();
s.acquireUninterruptibly();
s.release();
s.acquireUninterruptibly();
s.release();
assertEquals(1, s.availablePermits());
} finally {
}
}
/**
* Timed Acquire and release of semaphore succeed if
* initially available
*/
public void testTimedAcquireReleaseInSameThread() {
Semaphore s = new Semaphore(1, false);
try {
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
s.release();
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
s.release();
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
s.release();
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
s.release();
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
s.release();
assertEquals(1, s.availablePermits());
} catch( InterruptedException e){
unexpectedException();
}
}
/**
* A release in one thread enables an acquire in another thread
*/
public void testAcquireReleaseInDifferentThreads() {
final Semaphore s = new Semaphore(0, false);
Thread t = new Thread(new Runnable() {
public void run() {
try {
s.acquire();
s.release();
s.release();
s.acquire();
} catch(InterruptedException ie){
threadUnexpectedException();
}
}
});
try {
t.start();
Thread.sleep(SHORT_DELAY_MS);
s.release();
s.release();
s.acquire();
s.acquire();
s.release();
t.join();
} catch( InterruptedException e){
unexpectedException();
}
}
/**
* A release in one thread enables an uninterruptible acquire in another thread
*/
public void testUninterruptibleAcquireReleaseInDifferentThreads() {
final Semaphore s = new Semaphore(0, false);
Thread t = new Thread(new Runnable() {
public void run() {
s.acquireUninterruptibly();
s.release();
s.release();
s.acquireUninterruptibly();
}
});
try {
t.start();
Thread.sleep(SHORT_DELAY_MS);
s.release();
s.release();
s.acquireUninterruptibly();
s.acquireUninterruptibly();
s.release();
t.join();
} catch( InterruptedException e){
unexpectedException();
}
}
/**
* A release in one thread enables a timed acquire in another thread
*/
public void testTimedAcquireReleaseInDifferentThreads() {
final Semaphore s = new Semaphore(1, false);
Thread t = new Thread(new Runnable() {
public void run() {
try {
s.release();
threadAssertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
s.release();
threadAssertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
} catch(InterruptedException ie){
threadUnexpectedException();
}
}
});
try {
t.start();
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
s.release();
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
s.release();
s.release();
t.join();
} catch( InterruptedException e){
unexpectedException();
}
}
/**
* A waiting acquire blocks interruptibly
*/
public void testAcquire_InterruptedException() {
final Semaphore s = new Semaphore(0, false);
Thread t = new Thread(new Runnable() {
public void run() {
try {
s.acquire();
threadShouldThrow();
} catch(InterruptedException success){}
}
});
t.start();
try {
Thread.sleep(SHORT_DELAY_MS);
t.interrupt();
t.join();
} catch(InterruptedException e){
unexpectedException();
}
}
/**
* A waiting timed acquire blocks interruptibly
*/
public void testTryAcquire_InterruptedException() {
final Semaphore s = new Semaphore(0, false);
Thread t = new Thread(new Runnable() {
public void run() {
try {
s.tryAcquire(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
threadShouldThrow();
} catch(InterruptedException success){
}
}
});
t.start();
try {
Thread.sleep(SHORT_DELAY_MS);
t.interrupt();
t.join();
} catch(InterruptedException e){
unexpectedException();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?