所以我有一个列表和两个线程。一种是向列表中添加值并等待列表变空,另一种是删除值。代码如下所示:
public void addValueToList(String value) {
list.add(value);
waitForListToGetEmpty();
}
private synchronized waitForListToGetEmpty() {
while ( !this.list.isEmpty() ) {
try {
this.wait();
} catch ( final InterruptedException e ) { }
}
}
private synchronized removeValueFromList(int index) {
this.list.remove(index);
if (this.list.isEmpty()) {
this.notify();
}
}
我的问题是测试上面的代码。我尝试过这样的事情:
public void testAddValueToList() {
Thread addValueThread = new Thread( new Runnable() {
public void run() {
addValueToList("new value");
}
}
addValueThread.start();
}
public void testRemoveValueFromList() {
Thread removeValueThread = new Thread( new Runnable() {
public void run() {
removeValueFromList(0);
}
}
removeValueThread.start();
}
问题在于两个测试成功运行,但似乎第一个run
我称之为addValueToList
的问题永远不会被解决。任何人都可以帮我一些想法来测试这个吗?
答案 0 :(得分:0)
想象一下,如果addValueThread
先运行并将avalue添加到列表但在调用waitForListToGetEmpty()
之前,JVM会启动removeValueThread
并在抓取锁定的过程中调用removeValueFromList()
最终在notify()
被addValueThread
阻止之前致电wait()
。
同步您的addValueToList()
,以便addValueThread
立即获取锁定,removeValueFromList()
如果先removeValueThread
先运行,$("#Mycarousel").carousel('next');
也会抛出异常