黑马程序员技术交流社区
标题:
多线程异常
[打印本页]
作者:
王海龙2013
时间:
2013-4-8 22:27
标题:
多线程异常
本帖最后由 王海龙2013 于 2013-4-8 23:18 编辑
/**
等待唤醒机制
wait();线程等待
notify();唤醒其他线程
notifyAll();唤醒全部线程
都使用在同步中,因为要对持有监视器(锁)的线程操作,所以要用在同步中,只有同步才有锁。
因为这些方法在操作同步线程时,都必须要标识它们所操作的线程共有的锁,只有同一锁上的被等待线程,可以被同一个锁上notify唤醒。不同锁的线程不能进行唤醒。就是只能于相同锁上才有效。
锁可以是任意对象,因此能被任意对象调用的方法只能定义在Object类中。
线程间通讯
多个线程操作同一个资源,操作动作不同(输入输出)。
*/
class Res//要共用的资源
{
String name;
String sex;
boolean flag = false;//用来改变线程状态
}
//输入操作线程
class Input implements Runnable
{
private Res r;
Input(Res r)
{
this.r = r;
}
public void run()
{
int x = 0;//定义输入值
while(true)
{
synchronized(r)//使用唯一对象r使锁唯一
{
if(r.flag)
try{r.wait();}catch(Exception e){}//wait()有异常,实现接口中只能try
if(x==0)
{
r.name="mini";
r.sex="man";
}
else
{
r.name="五一";
r.sex="女";
}
x = (x+1)%2;
r.flag = true;//改变线程状态
notify();//唤醒线程
}
}
}
}
//输出操作线程
class Output implements Runnable
{
private Res r;
Output(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{
synchronized(r)
{
if(!r.flag)
try{r.wait();}catch(Exception e){}//wait()有异常,实现接口中只能try
System.out.println(r.name+"---"+r.sex);
r.flag = false;//改变线程状态
notify();//唤醒线程
}
}
}
}
class InputOutputDemo
{
public static void main(String[] args)
{
//建立共用操作对象
Res r = new Res();
//建立输入输出操作动作对象
Input in = new Input(r);
Output out = new Output(r);
//建立输入输出操作线程
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
//开启输入输出线程,开始运行
t1.start();
t2.start();
}
}
/*
F:\JAVA学习\java学习文档>java InputOutputDemo
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Input.run(InputOutputDemo.java:56)
at java.lang.Thread.run(Thread.java:722)
mini---man
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Output.run(InputOutputDemo.java:87)
at java.lang.Thread.run(Thread.java:722)
*/
复制代码
作者:
王海龙2013
时间:
2013-4-8 22:28
不懂是什么,编译过了,运行就挂了
作者:
Friendy89
时间:
2013-4-8 23:14
你代码写错了,你把notify();改成r.notify();就可以运行了,因为你使用的锁是r所以唤醒的也用r
作者:
王海龙2013
时间:
2013-4-8 23:17
群里人说了,52和79的没有具体调用对象,应该是r.notify();
作者:
王海龙2013
时间:
2013-4-8 23:18
真的是不小心啊,还几天没有明白
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2