📄 linkedblockingdequetest.java
字号:
*/
public void testAdd() {
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
assertTrue(q.add(new Integer(i)));
}
assertEquals(0, q.remainingCapacity());
q.add(new Integer(SIZE));
} catch (IllegalStateException success){
}
}
/**
* addAll(null) throws NPE
*/
public void testAddAll1() {
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(1);
q.addAll(null);
shouldThrow();
}
catch (NullPointerException success) {}
}
/**
* addAll(this) throws IAE
*/
public void testAddAllSelf() {
try {
LinkedBlockingDeque q = populatedDeque(SIZE);
q.addAll(q);
shouldThrow();
}
catch (IllegalArgumentException success) {}
}
/**
* addAll of a collection with null elements throws NPE
*/
public void testAddAll2() {
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
Integer[] ints = new Integer[SIZE];
q.addAll(Arrays.asList(ints));
shouldThrow();
}
catch (NullPointerException success) {}
}
/**
* addAll of a collection with any null elements throws NPE after
* possibly adding some elements
*/
public void testAddAll3() {
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
Integer[] ints = new Integer[SIZE];
for (int i = 0; i < SIZE-1; ++i)
ints[i] = new Integer(i);
q.addAll(Arrays.asList(ints));
shouldThrow();
}
catch (NullPointerException success) {}
}
/**
* addAll throws ISE if not enough room
*/
public void testAddAll4() {
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(1);
Integer[] ints = new Integer[SIZE];
for (int i = 0; i < SIZE; ++i)
ints[i] = new Integer(i);
q.addAll(Arrays.asList(ints));
shouldThrow();
}
catch (IllegalStateException success) {}
}
/**
* Deque contains all elements, in traversal order, of successful addAll
*/
public void testAddAll5() {
try {
Integer[] empty = new Integer[0];
Integer[] ints = new Integer[SIZE];
for (int i = 0; i < SIZE; ++i)
ints[i] = new Integer(i);
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
assertFalse(q.addAll(Arrays.asList(empty)));
assertTrue(q.addAll(Arrays.asList(ints)));
for (int i = 0; i < SIZE; ++i)
assertEquals(ints[i], q.poll());
}
finally {}
}
/**
* put(null) throws NPE
*/
public void testPutNull() {
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
q.put(null);
shouldThrow();
}
catch (NullPointerException success){
}
catch (InterruptedException ie) {
unexpectedException();
}
}
/**
* all elements successfully put are contained
*/
public void testPut() {
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
Integer I = new Integer(i);
q.put(I);
assertTrue(q.contains(I));
}
assertEquals(0, q.remainingCapacity());
}
catch (InterruptedException ie) {
unexpectedException();
}
}
/**
* put blocks interruptibly if full
*/
public void testBlockingPut() {
Thread t = new Thread(new Runnable() {
public void run() {
int added = 0;
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
q.put(new Integer(i));
++added;
}
q.put(new Integer(SIZE));
threadShouldThrow();
} catch (InterruptedException ie){
threadAssertEquals(added, SIZE);
}
}});
t.start();
try {
Thread.sleep(SHORT_DELAY_MS);
t.interrupt();
t.join();
}
catch (InterruptedException ie) {
unexpectedException();
}
}
/**
* put blocks waiting for take when full
*/
public void testPutWithTake() {
final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
Thread t = new Thread(new Runnable() {
public void run() {
int added = 0;
try {
q.put(new Object());
++added;
q.put(new Object());
++added;
q.put(new Object());
++added;
q.put(new Object());
++added;
threadShouldThrow();
} catch (InterruptedException e){
threadAssertTrue(added >= 2);
}
}
});
try {
t.start();
Thread.sleep(SHORT_DELAY_MS);
q.take();
t.interrupt();
t.join();
} catch (Exception e){
unexpectedException();
}
}
/**
* timed offer times out if full and elements not taken
*/
public void testTimedOffer() {
final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
Thread t = new Thread(new Runnable() {
public void run() {
try {
q.put(new Object());
q.put(new Object());
threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
threadShouldThrow();
} catch (InterruptedException success){}
}
});
try {
t.start();
Thread.sleep(SMALL_DELAY_MS);
t.interrupt();
t.join();
} catch (Exception e){
unexpectedException();
}
}
/**
* take retrieves elements in FIFO order
*/
public void testTake() {
try {
LinkedBlockingDeque q = populatedDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
assertEquals(i, ((Integer)q.take()).intValue());
}
} catch (InterruptedException e){
unexpectedException();
}
}
/**
* take blocks interruptibly when empty
*/
public void testTakeFromEmpty() {
final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
Thread t = new Thread(new Runnable() {
public void run() {
try {
q.take();
threadShouldThrow();
} catch (InterruptedException success){ }
}
});
try {
t.start();
Thread.sleep(SHORT_DELAY_MS);
t.interrupt();
t.join();
} catch (Exception e){
unexpectedException();
}
}
/**
* Take removes existing elements until empty, then blocks interruptibly
*/
public void testBlockingTake() {
Thread t = new Thread(new Runnable() {
public void run() {
try {
LinkedBlockingDeque q = populatedDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
assertEquals(i, ((Integer)q.take()).intValue());
}
q.take();
threadShouldThrow();
} catch (InterruptedException success){
}
}});
t.start();
try {
Thread.sleep(SHORT_DELAY_MS);
t.interrupt();
t.join();
}
catch (InterruptedException ie) {
unexpectedException();
}
}
/**
* poll succeeds unless empty
*/
public void testPoll() {
LinkedBlockingDeque q = populatedDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
assertEquals(i, ((Integer)q.poll()).intValue());
}
assertNull(q.poll());
}
/**
* timed poll with zero timeout succeeds when non-empty, else times out
*/
public void testTimedPoll0() {
try {
LinkedBlockingDeque q = populatedDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
}
assertNull(q.poll(0, TimeUnit.MILLISECONDS));
} catch (InterruptedException e){
unexpectedException();
}
}
/**
* timed poll with nonzero timeout succeeds when non-empty, else times out
*/
public void testTimedPoll() {
try {
LinkedBlockingDeque q = populatedDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
}
assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
} catch (InterruptedException e){
unexpectedException();
}
}
/**
* Interrupted timed poll throws InterruptedException instead of
* returning timeout status
*/
public void testInterruptedTimedPoll() {
Thread t = new Thread(new Runnable() {
public void run() {
try {
LinkedBlockingDeque q = populatedDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
threadAssertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
}
threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
} catch (InterruptedException success){
}
}});
t.start();
try {
Thread.sleep(SHORT_DELAY_MS);
t.interrupt();
t.join();
}
catch (InterruptedException ie) {
unexpectedException();
}
}
/**
* timed poll before a delayed offer fails; after offer succeeds;
* on interruption throws
*/
public void testTimedPollWithOffer() {
final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
Thread t = new Thread(new Runnable() {
public void run() {
try {
threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
threadShouldThrow();
} catch (InterruptedException success) { }
}
});
try {
t.start();
Thread.sleep(SMALL_DELAY_MS);
assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
t.interrupt();
t.join();
} catch (Exception e){
unexpectedException();
}
}
/**
* putFirst(null) throws NPE
*/
public void testPutFirstNull() {
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
q.putFirst(null);
shouldThrow();
}
catch (NullPointerException success){
}
catch (InterruptedException ie) {
unexpectedException();
}
}
/**
* all elements successfully putFirst are contained
*/
public void testPutFirst() {
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
Integer I = new Integer(i);
q.putFirst(I);
assertTrue(q.contains(I));
}
assertEquals(0, q.remainingCapacity());
}
catch (InterruptedException ie) {
unexpectedException();
}
}
/**
* putFirst blocks interruptibly if full
*/
public void testBlockingPutFirst() {
Thread t = new Thread(new Runnable() {
public void run() {
int added = 0;
try {
LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
for (int i = 0; i < SIZE; ++i) {
q.putFirst(new Integer(i));
++added;
}
q.putFirst(new Integer(SIZE));
threadShouldThrow();
} catch (InterruptedException ie){
threadAssertEquals(added, SIZE);
}
}});
t.start();
try {
Thread.sleep(SHORT_DELAY_MS);
t.interrupt();
t.join();
}
catch (InterruptedException ie) {
unexpectedException();
}
}
/**
* putFirst blocks waiting for take when full
*/
public void testPutFirstWithTake() {
final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
Thread t = new Thread(new Runnable() {
public void run() {
int added = 0;
try {
q.putFirst(new Object());
++added;
q.putFirst(new Object());
++added;
q.putFirst(new Object());
++added;
q.putFirst(new Object());
++added;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -