我正在测试一个用于多线程应用程序中的通信的类。虽然pop
和add
的简单使用没有问题,但当我尝试检查堆栈是否为空,然后wait
,直到有人add
是一个元素时,事情就会中断它
我的课程:
public class SynchronizedStack<T>{
private final Stack<T> data;
public SynchronizedStack(){
this.data = new Stack<>();
}
public T pop(){
synchronized (this.data) {
if(this.data.isEmpty())
return null;
T object = this.data.pop();
this.data.notifyAll();
return object;
}
}
public void add(T e){
synchronized (this.data){
this.data.add(e);
this.data.notifyAll();
}
}
public void waitUntilFilled() throws InterruptedException {
synchronized (this.data){
while(this.data.isEmpty())
this.data.wait();
}
}
我的问题在于waitUntilFilled
方法。当它被调用并且堆栈被填满时,没有任何错误,但是当它在空堆栈上被调用时会导致死锁。
我的测试用例:
@Test
public void testWaitUntilFilled(){
SynchronizedStack<Integer> ss = new SynchronizedStack<>();
Runnable producer = ()->{
ss.add(1);
};
Runnable consumer = ()->{
try {
ss.waitUntilFilled();
} catch (InterruptedException e) {
fail(e);
}
assertNotNull(ss.pop());
};
Thread p = new Thread(producer, "producer");
Thread c = new Thread(consumer, "consumer");
c.run();
p.run();
}