我正在设计两个线程:一个必须获取播放器的名称,第二个线程必须等待设置名称才能继续,但是第一个线程中的notify()全部抛出IllegalMonitorStateException错误。
private NameFecth nameFetch;
private UseName useName;
private Object nameSetLock;
public static void method{
nameSetLock = new Object()
nameFetch = new NameFetch(nameSetLock);
useName = new UseName(nameSetLock);
Thread nameFetchThread = new Thread(nameFetch);
nameFetchThread.start();
Thread useNameThread = new Thread(useName);
useNameThread.start();
}
public class NameFetch implements Runnable{
/*variables and constructers*/
public void run(){
/*get name and set the variable somehow*/
synchronized(nameSetLock){
notifyAll();
}
}
}
public class UseName implements Runnable{
/*variables and constructers*/
public void run(){
while(!nameBeenSet){
synchronized(nameSetLock){
try{
wait();
}catch(InterruptedException e) {}
}
}
}
我做错了什么?
最佳答案
您在调用wait
和notify
时未同步正在等待或通知的内容。如Object.notifyAll
中所述:
所以这:
synchronized(nameSetLock){
notifyAll();
}
应该:
synchronized(nameSetLock){
nameSetLock.notifyAll();
}
...和
wait
的同上。请注意,由于您使用的是syncronized
而不是synchronized
,因此您当前的代码甚至无法编译,这表明您没有发布实际的代码。在输入代码时,您实际上已经改变了问题-在这种情况下,您应该编辑问题以使其更具代表性。关于java - notifyAll()抛出IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18209552/