跪求看看我这个生产者消费者哪里不对?为什么死锁了?

lg798167096 2017-10-07 08:07:31
public class WaitAndNotify {
public static void main(String[] args) throws IOException
{
Food food = new Food();
new Thread(new Consumer("消费者一", food)).start();
// new Thread(new Consumer("消费者二", food)).start();
// new Thread(new Consumer("消费者三", food)).start();
//
new Thread(new Producer("生产者一", food)).start();
// new Thread(new Producer("生产者二", food)).start();
// new Thread(new Producer("生产者三", food)).start();

}
}
class Producer implements Runnable
{
private Food food;
private String producerName;

public Producer(String producerName, Food food)
{
this.producerName = producerName;
this.food = food;
}

@Override
public void run()
{
while (true)
{
try
{
food.produce(producerName);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}

}

class Consumer implements Runnable
{

private Food food;
private String consumerName;

public Consumer(String consumerName, Food food)
{
this.consumerName = consumerName;
this.food = food;
}

@Override
public void run()
{
try
{
food.consume(consumerName);
} catch (InterruptedException e)
{
e.printStackTrace();
}

}

}

class Food
{
private AtomicInteger foodNum = new AtomicInteger(0);

public void produce(String s) throws InterruptedException
{
synchronized (this)
{
while (foodNum.get()==5)
{
System.out.println(s+"box is full,size = " + foodNum);
this.wait();
}
foodNum.incrementAndGet();
System.out.println(s+"produce success foodNum = " + foodNum);
this.notifyAll();
}

}

public void consume(String s) throws InterruptedException
{
synchronized (this)
{
while (foodNum.get()==0)
{
System.out.println(s+"box is empty,size = " + foodNum);
this.wait();
}
foodNum.decrementAndGet();
System.out.println(s+"consume success foodNum = " + foodNum);
this.notifyAll();
}

}
}
...全文
60 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧