黑马程序员技术交流社区
标题:
多生产多消费代码报错,麻烦高手看下
[打印本页]
作者:
haozi050
时间:
2014-1-31 21:49
标题:
多生产多消费代码报错,麻烦高手看下
本帖最后由 haozi050 于 2014-2-9 08:35 编辑
import java.util.concurrent.locks.*;
class Resource
{
// 定义商品名称和编号
private String name;
private int count=1;
// 添加一个标记,如果为假则生产否则不生产只消费。
boolean flag=false;
// 为方便起见,将生产馒头方式和消费馒头方式定义在这里
Lock lock=new ReentrantLock();
// 根据锁获取监视器方法对象
Condition c=lock.newCondition();
public void set(String name)
{
// 对于生产者,如果为真的话代表有馒头需要等待,否则就生产。生产完之后要将标记改为价,唤醒消费者,自己再等待
try{
lock.lock();
while(flag)
{
try{c.await();}catch(InterruptedException e){}
}
this.name=name+"--"+count;
System.out.println(Thread.currentThread().getName()+"...生产者..."+name+count);
count++;
flag=true;
c.signalAll();
}finally{
lock.unlock();
}
}
public synchronized void get()
{
// 对于消费者如果为假的话表示没有馒头需要等待,如果为真的话就消费,然后在将标记改为假,唤醒生产者,自己再等待。
try{
lock.lock();
while(!flag)
{
try{c.await();}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"...消费者..."+name);
flag=false;
c.signalAll();
}
}
finally{
lock.unlock();
}
}
class Producer implements Runnable
{
// 此处需要使用馒头对象调用生产馒头方法,如果new对象的话,消费者类中也是new对象,那么生产和消费的就不是同一个对象了
// ,简单说编号就错了。为了保证资源唯一,可以将馒头对象传递给生产者,消费者,这就唯一了。所以定义在构造函数中,一初始化就有资源对应。
Resource r;
Producer(Resource r)
{
this.r=r;
}
public void run()
{
while(true)
{
r.set("馒头");
}
}
}
class Consumer implements Runnable
{
Resource r;
Consumer(Resource r)
{
this.r=r;
}
public void run()
{
while(true)
{
r.get();
}
}
}
class ProductorConsumerDemo
{
public static void main(String[] args)
{
Resource r=new Resource();
Producer p=new Producer(r);//创建生产任务
Consumer c=new Consumer(r);//创建消费任务
Thread t0=new Thread(p);//创建线程明确生产任务
Thread t1=new Thread(p);//创建线程明确生产任务
Thread t2=new Thread(c);//创建线程明确消费任务
Thread t3=new Thread(c);//创建线程明确生产任务
t0.start();
t1.start();
t2.start();
t3.start();
}
}
复制代码
作者:
haozi050
时间:
2014-1-31 21:52
问题是主函数老是报错,不知道到是为什么?求高手指点。
作者:
陈文杰
时间:
2014-1-31 21:54
哥们,把消费者唤醒生产者c改为p,你手误。
作者:
陈文杰
时间:
2014-1-31 21:55
一定图方便粘贴没改完
作者:
haozi050
时间:
2014-1-31 22:17
陈文杰 发表于 2014-1-31 21:54
哥们,把消费者唤醒生产者c改为p,你手误。
图已经粘贴完了。我现在写的还不是最终版的生产者消费者例子,现在只有一个锁,所有线程即生产者消费者线程都绑定在这个锁上,唤醒时是唤醒所有的线程,虽然效率有点低,但逻辑应该是没有问题的。就是eclipse在main()函数上老是报错,求高手再看一下是什么问题。
作者:
陈文杰
时间:
2014-1-31 22:25
我怎么看你消费代码最后唤醒消费者监视器下线程。p.singleall
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2