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

---------------------- 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值