当生产者遇上消费者的时候那些纠结的线程通信问题,可能会有一些问题,甚至思路是错的,请高手指教下:
package com.yyq.study.thread.notify;
public class Company {//公司负责协调生产者和消费者间的关系
public static void main(String[] args)
{
Storage storage = new Storage();
(new Consumer(storage)).start();
(new Producer(storage)).start();
}
}
package com.yyq.study.thread.notify;
public class Consumer extends Thread {//消费者,负责消费商品,并通知生产者生产
private Storage storage;
public Consumer(Storage storage)
{
this.storage = storage;
}
public void run() {
while(true)
{
System.out.println("消费者查看仓库");
if(!storage.isHaveProduct())
{
System.out.println("没有产品,通知生产者生产");
synchronized(storage)
{
storage.notify();
try {
storage.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else
{
System.out.println("有产品,开始消费");
synchronized(storage)
{
storage.setHaveProduct(false);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("消费完成");
storage.notify();
try {
storage.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
package com.yyq.study.thread.notify;
public class Producer extends Thread {//生产者,生产消费品,并通知消费者消费
private Storage storage;
public Producer(Storage storage)
{
this.storage = storage;
}
public void run() {
while(true)
{
System.out.println("生产者查看仓库");
if(storage.isHaveProduct())
{
System.out.println("有产品,等待消费");
synchronized(storage)
{
storage.notify();
try {
storage.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else
{
System.out.println("没有产品,开始生产");
synchronized(storage)
{
storage.setHaveProduct(true);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("生产完成,通知消费者消费");
synchronized(storage)
{
storage.notify();
try {
storage.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
package com.yyq.study.thread.notify;
public class Storage { //仓库类,提供检验是否有消费品的方法
private boolean isHaveProduct = false;
public boolean isHaveProduct() {
return isHaveProduct;
}
public synchronized void setHaveProduct(boolean isHaveProduct) {
this.isHaveProduct = isHaveProduct;
}
}
运行结果:
生产者查看仓库
消费者查看仓库
没有产品,通知生产者生产
没有产品,开始生产
生产完成,通知消费者消费
消费者查看仓库
有产品,开始消费
消费完成,通知生产者生产
生产者查看仓库
没有产品,开始生产
生产完成,通知消费者消费
消费者查看仓库
有产品,开始消费
消费完成,通知生产者生产
...........................................