本帖最后由 张洪慊 于 2013-5-28 16:47 编辑
妹纸 (*^__^*) 嘻嘻…… 我要占楼~~
运行你的代码报了一个没留意过的异常:
IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者(这句话给了我提示)- synchronized(r)//这里使用锁r,也就是new Rec()锁
- {
- if(r.flag)
- {
- try{r.wait();}catch(Exception e){}//这里需要指示wait()的线程所持有的锁
- }
- if(x==0)
- {
- r.name="mike";
- r.sex="man";
- }
- else
- {
- r.name="傻蛋";
- r.sex="女";
- }
- x=(x+1)%2;//为了间隔,对二求余
- r.flag=true;//把flag值设为ture
- notify();
- //r.notify();//修正后
- /*
- 这个位置报错,这句话相当于this.notify(即使加上还是该错误)
- 也就是this锁并不是该线程的所有者,因为这里没有给出this锁.
-
- */
- }
-
- }
-
- }
复制代码 第二个线程的run方法同时用到了同步代码块和同步函数,在这里用不到,可以选用同时都是同步函数/同步代码块
和上面对应把你代码修正下,使用同步代码块:- public void run()
- {
- while(true)
- {
-
- synchronized(r)//是不是用的同一个锁
- {
- if(r.flag)//r.flag=true说明有值需要打印
- {
- System.out.println(r.name+"-------"+r.sex);
- }
- r.flag=false;
- r.notify();
- try{r.wait();}catch(Exception e){}//打印完之后唤醒输入->进入等待
- /*
- 这段程序怎么写都行,逻辑正确就OK
-
- */
- }
- }
- }
复制代码 最后关于:IllegalMonitorStateException(API),RuntimeException子类
抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
->说的太拗口了
理解了下:
①某一线程已经试图等待锁
② 以上面为例:
该线程notify其他正在等待锁(this)
而该线程自身没有该锁(this)
|