我正在设计两个线程:一个必须获取播放器的名称,第二个线程必须等待设置名称才能继续,但是第一个线程中的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) {}
       }
     }

}

我做错了什么?

最佳答案

您在调用waitnotify时未同步正在等待或通知的内容。如Object.notifyAll中所述:



所以这:

synchronized(nameSetLock){
  notifyAll();
}

应该:
synchronized(nameSetLock){
  nameSetLock.notifyAll();
}

...和wait的同上。请注意,由于您使用的是syncronized而不是synchronized,因此您当前的代码甚至无法编译,这表明您没有发布实际的代码。在输入代码时,您实际上已经改变了问题-在这种情况下,您应该编辑问题以使其更具代表性。

关于java - notifyAll()抛出IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18209552/

10-09 02:01