黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
李道福
时间:
2013-9-10 20:07
标题:
多线程问题
本帖最后由 李道福 于 2013-9-10 23:29 编辑
class Resource{
String name;
int age;
boolean flag=false;
Resource(){}
Resource(String name,int age){
this.name=name;
this.age=age;
}
}
class Input implements Runnable{
Resource s=null;
Input(Resource s){
this.s=s;
}
public void run(){
int x=0;
while(true)
synchronized(s){
if(s.flag)
try{s.wait();}catch(Exception e){}//这里如果我把s.wait()改成wait(),程序运行的结果就和之前不一样了
if(x%2==0){
s.name="lidaofu";
s.age=24;
}else{
s.name="李道福";
s.age=23;
}
x=(x+1)%2;
s.flag=true;
s.notify();
}
}
}
class Output implements Runnable{
Resource s=null;
Output(Resource r){
this.s=r;
}
public void run(){
while(true)
synchronized(s){
if(!s.flag)
try{s.wait();}catch(Exception e){}
System.out.println(s.name+"++++++"+s.age);
s.flag=false;
s.notify();
}
}
}
public class ProduConsume{
public static void main(String[] args){
Resource r=new Resource();
Input in=new Input(r);
Output out=new Output(r);
Thread th=new Thread(in);
Thread th2=new Thread(out);
th.start();
th2.start();
}
}
复制代码
这里的s.wait()和s.notity()等待,唤醒的是s这个线程池中的线程,那如果我改成wait(),那这个wait()把线程放在那个线程池中的?
作者:
垂天云
时间:
2013-9-10 20:24
一定要指定对象才可以等待吧,否则的话,多线程,就不一定是哪个线程抢到wait执行权······
作者:
jìng╮煜
时间:
2013-9-10 22:24
好像只写 wait的话, 不论哪个线程碰到,都要等待.
作者:
流浪的风
时间:
2013-9-10 22:47
如果你把wait()上的锁去掉的话,就会出现同步嵌套,非静态默认的锁是this,wait(),notify(),notifyAll()这些方法在使用的时候必须指定线程所持有监视器(锁),因为只有同一个监视器上的被等待线程,可以被同一个监视器上的notify()唤醒,不可以对不同锁中的线程进行唤醒,所以必须使用同一个监视器(锁)对象来调用这些方法。
作者:
陶智第
时间:
2013-9-10 22:58
这里的s相当于同步中的监视器
如果wait()前面没有s这类似的监视器的话,那么就不能保证输入域输出线程之间的同步,可能存在安全问题
如果是这样的话,使用wait方法也就没什么作用
作者:
李政
时间:
2013-9-10 23:11
wait()方法是Object中的方法,也就是说在调用wait方法的时候需要加上监视器对象,不然的话就成了这个类在调用wait()方法了,也就是相当于程序中的Input.wait()
这时候就会报wait()的所有者不是监视器对象这个异常了,而你在这里对这个异常做了处理,所以程序会继续运行下去,只不过相当于wait()这个方法是无效的 如果在异常处理语句中加上处理内容,就很容易看出来了
try{wait();}catch(Exception e){System.out.println("fda");
e.printStackTrace();}
作者:
李道福
时间:
2013-9-10 23:29
李政 发表于 2013-9-10 23:11
wait()方法是Object中的方法,也就是说在调用wait方法的时候需要加上监视器对象,不然的话就成了这个类在调 ...
多谢……
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2