黑马程序员---传统线程之间的同步通信

来源:互联网 发布:淘宝联盟挣钱 编辑:程序博客网 时间:2024/06/04 01:01

---------------------- android培训、java培训、期待与您交流! ----------------------


关于Tread之间进行同步通信
张孝祥老师举了一个面试题
子线程循环XX次,主线程循环XX次
这样交替循环xx次
我写了一个类如下:

public class ThreadTest{static boolean isSub=false;static Thread mainThread=null;static Thread subThread=null;public static void main(String[] args){subThread=new Thread(new Runnable(){public void run(){try{for(int i=0;i<50;i++){synchronized(ThreadTest.class){if(!isSub)subThread.wait();for(int j=0;j<5;j++)System.out.println("sub: "+j+" of "+i);isSub=false;mainThread.notify();}}}catch(InterruptedException e){e.printStackTrace();}}});mainThread=new Thread(new Runnable(){public void run(){try{for(int i=0;i<50;i++){synchronized(ThreadTest.class){if(isSub)mainThread.wait();for(int j=0;j<5;j++)System.out.println("main: "+j+" of "+i);isSub=true;subThread.notify();}}}catch(InterruptedException e){e.printStackTrace();}}});mainThread.start();subThread.start();}}


代码重写了许多遍
换了好多种方式
总是抛java.lang.IllegalMonitorStateException


然后查找了一下这个异常的相关信息
这个异常会在这种情况下抛出:
当前线程没有当前对象的锁资源时调用对象的wait()或notify()或notifyAll()方法

感觉有点明白synchronized为什么要传一个对象进去了
wait()方法和notify()方法是Object的方法,而不是线程的方法
之前一直以为线程的wait方法就是让这个线程等,notify()方法就是唤醒这个线程
这样获得的锁资源是主类的字节码
但是调用的是subThread和mainThread的wait和notify方法
这样就抛出了java.lang.IllegalMonitorStateException

所以将上面代码中的XX.wait()和XX.notify前面的subThread和mainThread全部
换成ThreadTest.class即可

到这里也明白了为什么要把主类和子类的方法抽出来放进一个Business类中了
synchronized可以直接写在函数里面 锁资源就是当前的实例对象了
wait和notify就可以直接调用this.wait()和this.notify



---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima