package cn.itcast;public class ThreadCommunication {
public static boolean bool =true;
public static void main(String[] args) {
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<20;i++){
synchronized (this.getClass()) {
while(!bool){
for(int j=0;j<10;j++){
System.out.println("thread:"+Thread.currentThread()+"----"+j+"----"+i);
}
bool=true;
this.notify();
}
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
thread.start();
for(int j=0;j<20;j++){
synchronized(thread.getClass()){
while(bool){
for(int i=0;i<10;i++){
System.out.println("main:"+Thread.currentThread()+"----"+i+"----"+j);
}
bool=false;
thread.notify();
}
try {
thread.wait();
} catch (InterruptedException e) {
System.out.println("hh");
e.printStackTrace();
}
}
}
}}
运行时出现异常:Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at cn.itcast.ThreadCommunication.main(ThreadCommunication.java:37)
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at cn.itcast.ThreadCommunication$1.run(ThreadCommunication.java:21)
at java.lang.Thread.run(Unknown Source)
求解!

解决方案 »

  1.   

    Thread thread=new Thread(new Runnable()) 少了一个括号
      

  2.   

    没看具体逻辑,但是说两点:
    1、wait和notify必须在同步方法或者同步代码块中调用,这点你搞对了
    2、当前线程(执行wait或者notify或notifyAll的线程)必须是这个对象的锁的持有者,必须你调用的方式是:
    xxx.wait(),那么你同步的就必须是xxx,就楼主的例子:因为你同步的是xxx.getClass()这个对象,那么就应该用xxx.getClass().wait()这种方式,或者改为synchronized(xxx),然后xxx.wait(),对于notify,notifyAll也是一样的改法。
      

  3.   

    错误信息表示notify不是在synchronized方法或synchronized块中调用的
      

  4.   

    我觉得有两个问题:
    1 同步的对象不一致.
    thread线程里synchronized (this.getClass()) ,这个同步对象是匿名类的一个Class对象。这个匿名类是ThreadCommunication$1.而调用nonify()和wait()的是this. 这个this 是匿名类”ThreadCommunication$1“的对象。
    在main线程里,synchronized(thread.getClass()),这个同步对象是一个ThreadL类的Class对象,与thread线程用的显然不一样。建议用一个其他对象作同步对象。比如:static Object forLock=new Object();2 最后执行完循环的线程(本程序是thread)没有唤醒机会,程序不能正常退出。
    建议while里先等待,后运行。
    试着改了一下,供参考:
    /* ThreadCommunication1.java
     */
    package cn.itcast;public class ThreadCommunication1
    {
    public static Object forLock=new Object();
    public static boolean bool =true;
    public static void main(String[] args)
            {
    Thread thread=new Thread(new Runnable()
    {
    @Override
    public void run() 
    { for(int i=0;i<20;i++)
    {
    //ThreadCommunication1.forLock=this.getClass();
    synchronized (ThreadCommunication1.forLock)
            {
    while(bool)
    {
    try
            {
    ThreadCommunication1.forLock.wait();
    }
            catch (InterruptedException e) 
    {
    e.printStackTrace();
    }
    } for(int j=0;j<10;j++)
    {
    System.out.println("thread:"+Thread.currentThread()+
    "----"+j+"----"+i);
    }
    bool=true;
    ThreadCommunication1.forLock.notify(); }
    }
    }
    });
    thread.start();
    for(int j=0;j<20;j++)
    {
    synchronized(ThreadCommunication1.forLock)
    {
    while(!bool)
    {
    try 
    {
    ThreadCommunication1.forLock.wait();
    }
            catch (InterruptedException e)
            {
    System.out.println("hh");
    e.printStackTrace();
    }
    }
    for(int i=0;i<10;i++)
    {
    System.out.println("main:"+Thread.currentThread()+"----"+i+"----"+j);
    }
    bool=false;
    ThreadCommunication1.forLock.notify();
    }
    }
    }//end main}//end class