---------------------- 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
详细请查看: http://edu.csdn.net/heima