黑马程序员技术交流社区
标题:
发现个有趣的现象,大家看一下,找一下答案
[打印本页]
作者:
王中利
时间:
2012-11-14 16:06
标题:
发现个有趣的现象,大家看一下,找一下答案
package day_nov_14;
class Resouse{
private String name;
private int count=1;
private boolean flag=false;
public synchronized void set(String name){
if(flag)
try {wait();} catch (InterruptedException e) {e.printStackTrace();}
this.name=name+count;
count++;
System.out.println(Thread.currentThread().getName()+".....生产者......生产者生成了"+this.name);
flag=true;
notify();
}
public synchronized void out(){
if(!flag);
try {wait();} catch (InterruptedException e) {e.printStackTrace();}
System.out.println(Thread.currentThread().getName()+"==========消费者吃了====吃了"+this.name);
flag=false;
notify();
}
}
class Producer implements Runnable{
private Resouse r;
Producer (Resouse r){
this.r=r;
}
public void run() {
for(int x=1;x<=50;x++){
r.set("饭");
}
}
}
class Consumer implements Runnable{
private Resouse r;
Consumer (Resouse r){
this.r=r;
}
public void run() {
for(int x=1;x<=50;x++){
r.out();
}
}
}
public class ProduceVsConsumer {
public static void main(String[] args) {
Resouse re=new Resouse();
Producer p=new Producer(re);
Consumer c=new Consumer(re);
Thread t1=new Thread(c);
Thread t2=new Thread(p);
t1.start();
t2.start();
}
}
最后两个线程开启的顺序不一样,运行结果就不一样。。。。
作者:
李桐
时间:
2012-11-14 16:28
第一种情况:t1先运行,消费者先落座等待,等待生产者生产,t2运行,生产者产出,flag变为true,消费者被唤醒,生产者等待,flag变为false,各循环50次,没有问题
第二种情况:t2先运行,flag为false,生产者陷入等待,t1再运行,判断"!flag"为真,消费者也陷入了等待......
所以,第一种情况跟第二种情况不一样
作者:
被遗弃者
时间:
2012-11-14 16:56
学习中!!!!!
作者:
黑马斯巴达
时间:
2012-11-14 17:06
第二种应该是t2运行,然后判断flag为flase运行一次,输出一次结果 。之后flag变为true。。。。此时notify只能唤醒生产者t2。。。这时生产者再次判断flag为true。。因此进入等待。而t1没有得到执行权……
作者:
黑马吕世成
时间:
2012-11-14 20:39
楼主能说说哪里不一样不!还真没看出来。。。
作者:
李卫源
时间:
2012-11-14 21:10
线程等待,然后通过标志来转换线程的运行
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2