黑马程序员技术交流社区
标题:
多生产者多消费者问题
[打印本页]
作者:
徐传任
时间:
2012-10-17 20:44
标题:
多生产者多消费者问题
class Resource
{
private String name;
private int count = 1;
private boolean flag = false;
public synchronized void set(String name)
{
if(flag) {
try{this.wait();}catch(InterruptedException e){}
} else {//老师讲的是用while来判断防止生产一个消费多个的问题,我这样用if else 来判断是不是也可以也不会出现安全问题
this.name = name + count;
count++;
System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
flag = true;
notifyAll();
}
}
public synchronized void out()// t3
{
if(!flag) {
try{this.wait();}catch(InterruptedException e){}
}else {
System.out.println(Thread.currentThread().getName()+"...消费者........"+this.name);
flag = false;
notifyAll();
}
}
}
class Producer implements Runnable
{
private Resource r;
Producer(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
r.set("烤鸭");
}
}
}
class Consumer implements Runnable
{
private Resource r;
Consumer(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
r.out();
}
}
}
class ProducerConsumerDemo
{
public static void main(String[] args)
{
Resource r = new Resource();
Producer pro = new Producer(r);
Consumer con = new Consumer(r);
Thread t0 = new Thread(pro);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
Thread t3 = new Thread(con);
t0.start();
t1.start();
t2.start();
t3.start();
}
}
复制代码
我这样用if else是不是也可以避免出现生产一个消费多个的问题,自己写的时候这样写了感觉应该也没问题,不大肯定,帮忙看看,谢谢
作者:
hello_world!
时间:
2012-10-17 22:46
//老师讲的是用while来判断防止生产一个消费多个的问题,我这样用if else 来判断是不是也可以也不会出现安全问题
这个问题,
最好用while语句,while语句能防止伪唤醒的情况。
伪唤醒发生的定义是一个线程不是被别的线程唤醒、不是被别的线程中断、或者超时,而被唤醒叫做伪唤醒。至于想具体了解什么是伪唤醒,自己可以查查文档,也可以看看张孝祥讲的jdk1.5的线程并发库的视频第4课31分钟开始看,里面有讲过。我的理解采用了老张的说法,就是你睡着了,可能不是你被别人叫醒的,有可能你是被噩梦惊醒的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2