semaphoretest.java
来自「SRI international 发布的OAA框架软件」· Java 代码 · 共 927 行 · 第 1/3 页
JAVA
927 行
/**
* hasQueuedThreads reports whether there are waiting threads
*/
public void testHasQueuedThreads() {
// final Semaphore lock = new Semaphore(1, false);
final Semaphore lock = new Semaphore(1, true);
Thread t1 = new Thread(new InterruptedLockRunnable(lock));
Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
try {
assertFalse(lock.hasQueuedThreads());
lock.acquireUninterruptibly();
t1.start();
Thread.sleep(SHORT_DELAY_MS);
assertTrue(lock.hasQueuedThreads());
t2.start();
Thread.sleep(SHORT_DELAY_MS);
assertTrue(lock.hasQueuedThreads());
t1.interrupt();
Thread.sleep(SHORT_DELAY_MS);
assertTrue(lock.hasQueuedThreads());
lock.release();
Thread.sleep(SHORT_DELAY_MS);
assertFalse(lock.hasQueuedThreads());
t1.join();
t2.join();
} catch(Exception e){
e.printStackTrace();
unexpectedException();
}
}
/**
* getQueueLength reports number of waiting threads
*/
public void testGetQueueLength() {
// final Semaphore lock = new Semaphore(1, false);
final Semaphore lock = new Semaphore(1, true);
Thread t1 = new Thread(new InterruptedLockRunnable(lock));
Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
try {
assertEquals(0, lock.getQueueLength());
lock.acquireUninterruptibly();
t1.start();
Thread.sleep(SHORT_DELAY_MS);
assertEquals(1, lock.getQueueLength());
t2.start();
Thread.sleep(SHORT_DELAY_MS);
assertEquals(2, lock.getQueueLength());
t1.interrupt();
Thread.sleep(SHORT_DELAY_MS);
assertEquals(1, lock.getQueueLength());
lock.release();
Thread.sleep(SHORT_DELAY_MS);
assertEquals(0, lock.getQueueLength());
t1.join();
t2.join();
} catch(Exception e){
e.printStackTrace();
unexpectedException();
}
}
/**
* getQueuedThreads includes waiting threads
*/
public void testGetQueuedThreads() {
// final PublicSemaphore lock = new PublicSemaphore(1, false);
final PublicSemaphore lock = new PublicSemaphore(1, true);
Thread t1 = new Thread(new InterruptedLockRunnable(lock));
Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
try {
assertTrue(lock.getQueuedThreads().isEmpty());
lock.acquireUninterruptibly();
assertTrue(lock.getQueuedThreads().isEmpty());
t1.start();
Thread.sleep(SHORT_DELAY_MS);
assertTrue(lock.getQueuedThreads().contains(t1));
t2.start();
Thread.sleep(SHORT_DELAY_MS);
assertTrue(lock.getQueuedThreads().contains(t1));
assertTrue(lock.getQueuedThreads().contains(t2));
t1.interrupt();
Thread.sleep(SHORT_DELAY_MS);
assertFalse(lock.getQueuedThreads().contains(t1));
assertTrue(lock.getQueuedThreads().contains(t2));
lock.release();
Thread.sleep(SHORT_DELAY_MS);
assertTrue(lock.getQueuedThreads().isEmpty());
t1.join();
t2.join();
} catch(Exception e){
e.printStackTrace();
unexpectedException();
}
}
/**
* drainPermits reports and removes given number of permits
*/
public void testDrainPermits() {
Semaphore s = new Semaphore(0, false);
assertEquals(0, s.availablePermits());
assertEquals(0, s.drainPermits());
s.release(10);
assertEquals(10, s.availablePermits());
assertEquals(10, s.drainPermits());
assertEquals(0, s.availablePermits());
assertEquals(0, s.drainPermits());
}
/**
* reducePermits reduces number of permits
*/
public void testReducePermits() {
PublicSemaphore s = new PublicSemaphore(10, false);
assertEquals(10, s.availablePermits());
s.reducePermits(1);
assertEquals(9, s.availablePermits());
s.reducePermits(10);
assertEquals(-1, s.availablePermits());
}
/**
* a deserialized serialized semaphore has same number of permits
*/
public void testSerialization() {
Semaphore l = new Semaphore(3, false);
try {
l.acquire();
l.release();
ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
out.writeObject(l);
out.close();
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
Semaphore r = (Semaphore) in.readObject();
assertEquals(3, r.availablePermits());
assertFalse(r.isFair());
r.acquire();
r.release();
} catch(Exception e){
e.printStackTrace();
unexpectedException();
}
}
/**
* Zero, negative, and positive initial values are allowed in constructor
*/
public void testConstructor_fair() {
Semaphore s0 = new Semaphore(0, true);
assertEquals(0, s0.availablePermits());
assertTrue(s0.isFair());
Semaphore s1 = new Semaphore(-1, true);
assertEquals(-1, s1.availablePermits());
Semaphore s2 = new Semaphore(-1, true);
assertEquals(-1, s2.availablePermits());
}
/**
* tryAcquire succeeds when sufficient permits, else fails
*/
public void testTryAcquireInSameThread_fair() {
Semaphore s = new Semaphore(2, true);
assertEquals(2, s.availablePermits());
assertTrue(s.tryAcquire());
assertTrue(s.tryAcquire());
assertEquals(0, s.availablePermits());
assertFalse(s.tryAcquire());
}
// /**
// * tryAcquire(n) succeeds when sufficient permits, else fails
// */
// public void testTryAcquireNInSameThread_fair() {
// Semaphore s = new Semaphore(2, true);
// assertEquals(2, s.availablePermits());
// assertTrue(s.tryAcquire(2));
// assertEquals(0, s.availablePermits());
// assertFalse(s.tryAcquire());
// }
//
/**
* Acquire and release of semaphore succeed if initially available
*/
public void testAcquireReleaseInSameThread_fair() {
Semaphore s = new Semaphore(1, true);
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();
}
}
// /**
// * Acquire(n) and release(n) of semaphore succeed if initially available
// */
// public void testAcquireReleaseNInSameThread_fair() {
// Semaphore s = new Semaphore(1, true);
// try {
// s.release(1);
// s.acquire(1);
// s.release(2);
// s.acquire(2);
// s.release(3);
// s.acquire(3);
// s.release(4);
// s.acquire(4);
// s.release(5);
// s.acquire(5);
// assertEquals(1, s.availablePermits());
// } catch( InterruptedException e){
// unexpectedException();
// }
// }
// /**
// * Acquire(n) and release(n) of semaphore succeed if initially available
// */
// public void testAcquireUninterruptiblyReleaseNInSameThread_fair() {
// Semaphore s = new Semaphore(1, true);
// try {
// s.release(1);
// s.acquireUninterruptibly(1);
// s.release(2);
// s.acquireUninterruptibly(2);
// s.release(3);
// s.acquireUninterruptibly(3);
// s.release(4);
// s.acquireUninterruptibly(4);
// s.release(5);
// s.acquireUninterruptibly(5);
// assertEquals(1, s.availablePermits());
// } finally {
// }
// }
// /**
// * release(n) in one thread enables timed acquire(n) in another thread
// */
// public void testTimedAcquireReleaseNInSameThread_fair() {
// Semaphore s = new Semaphore(1, true);
// try {
// s.release(1);
// assertTrue(s.tryAcquire(1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
// s.release(2);
// assertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
// s.release(3);
// assertTrue(s.tryAcquire(3, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
// s.release(4);
// assertTrue(s.tryAcquire(4, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
// s.release(5);
// assertTrue(s.tryAcquire(5, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
// assertEquals(1, s.availablePermits());
// } catch( InterruptedException e){
// unexpectedException();
// }
// }
/**
* release in one thread enables timed acquire in another thread
*/
public void testTimedAcquireReleaseInSameThread_fair() {
Semaphore s = new Semaphore(1, true);
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_fair() {
final Semaphore s = new Semaphore(0, true);
Thread t = new Thread(new Runnable() {
public void run() {
try {
s.acquire();
s.acquire();
s.acquire();
s.acquire();
} catch(InterruptedException ie){
threadUnexpectedException();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?