ms_ysj1 2015-10-01 23:26 采纳率: 0%
浏览 1425

java多线程初级问题!

/*
多线程之等待唤醒练习
线程运行到wait时 会一直停在那里等待 一直到被唤醒

*/

//实现双线程依次打印show2->show1->show2->show1....
class Demo
{
//标识 实现打印show2-show1-show2...
boolean b;
Demo(boolean b)
{
this.b = b;
}
/*synchronized*/ void show1(int i)
{
// System.out.println(i);
//锁对象定义的是obj1
//个人疑问: 【如果用到wait 定义不同锁对象的效果是否会不按规则打印】
synchronized(myLock.obj1){ //IllegalMonitorStateException 监视器异常?
if(b)
try{wait();}catch(Exception e){} //此代码会将线程T-0处于等待状态 并不会再往下执行
System.out.println("-----------show1---------i="+i+" "+Thread.currentThread().getName());
b = true;
notify();
}
}
/*synchronized*/ void show2(int i)
{

//锁对象定义的是obj2
synchronized(myLock.obj2){
if(!b)
try{wait();}catch(Exception e){}
System.out.println("-----------show2---------i="+i+" "+Thread.currentThread().getName());
b = false;
notify();
}
}
}
class myLock
{
//定义两个锁

public static Object obj1 = new Object();
public static Object obj2 = new Object();
}

class Test1 implements Runnable
{
Demo d;
Test1(Demo d)
{
this.d = d;
}
public void run()
{
for(int i = 1;i<=3;i++)
d.show1(i);
}
}
class Test2 implements Runnable
{
Demo d;
Test2(Demo d)
{
this.d = d;
}
public void run()
{
for(int i = 1;i<=3;i++)
d.show2(i);
}
}
class WaitDemo
{
public static void main(String[] args)
{
Demo d = new Demo(true);
Test1 te1 = new Test1(d);
Test2 te2 = new Test2(d);
Thread t1 = new Thread(te1);
Thread t2 = new Thread(te2);
t1.start();
t2.start();
}
}
为什么我使用不同对象锁时就出了异常 运行异常!!
求大神 谢谢~~
小弟初学者。

  • 写回答

3条回答

  • 毕小宝 博客专家认证 2015-10-02 03:36
    关注

    测试了你的代码,运行时异常,主要就是因为wait()和notify()方法是Object类的方法,它是内置条件队列,只能跟内置锁一起使用,就是只有持有当前对象的锁时,才能调用这两个方法。即你的synchronized(myLock.obj2)这里只能用synchronized(this),修改后就能正确打印了。(注意两个地方都只能用this锁)。
    抛出IllegalMonitorStateException 这个异常是因为"if the current thread is not the owner of this object's monitor."你是两个线程拥有不同的锁导致的。如果要使用者两个方法,必须是获取当前对象的锁即在synchronized(this)代码块中调用wait或者notify才能正确。

    评论

报告相同问题?

悬赏问题

  • ¥15 ROS Turtlebot3 多机协同自主探索环境时遇到的多机任务分配问题,explore节点
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题