生产者消费者模式代码实例
利用wait,notify,synchronized和多线程方法实现简单的生产者消费者模式,Java语言,JDK1.8,eclipse
package javaTest;
/**
* @ClassName: Production
* @Description: TODO 共享资源类
* @author Qiongjie
* @date 17-08-07 4:07:00 PM
*/
class Production{
private int i= -1;//产品标识id
private String name = "unknown";//产品名字
private boolean isFull=false;//产品队列是否有产品
/**
* @Title: produce
* @date 17-08-07 4:07:34 PM
* @Description: TODO 生产产品
* @throws Exception
*/
public synchronized void produce() throws Exception{
//生产(放入缓冲区)wait要么放在最前,要么最后
System.out.println("isFull=false开始不断生产...");
Thread.sleep(3);//模拟生产,sleep不释放锁
isFull=true;//模拟产品队列已满
System.out.println("isFull=true产品队列满了"+"\n");
notify();//唤醒其他线程,但没有释放锁
if(isFull) {//判断产品队列是否已满
wait();//释放锁,进入等待态等待被唤醒
}
}
/**
* @Title: consume
* @date 17-08-07 4:07:56 PM
* @Description: TODO 消费产品
* @throws Exception
*/
public synchronized void consume() throws Exception{
//消费(放入缓冲区)wait要么放在最前,要么最后
System.out.println("isFull=true开始不断消费...");
Thread.sleep(3000);//模拟消费,sleep不释放锁
isFull=false;//模拟产品队列已消费完
System.out.println("isFull=false产品队列消费完了"+"\n");
notify();//唤醒其他线程,但没有释放锁
if(!isFull) {//判断产品队列是否已消费完
wait();//释放锁,进入等待态等待被唤醒
}
}
}
/**
* @ClassName: Producer
* @Description: TODO生产线程
* @author Qiongjie
* @date 17-08-07 4:08:19 PM
*/
class Producer implements Runnable{
Production production;
/**
* <p>构造函数: Producer</p>
* <p>Description: 传入公共资源对象</p>
* @param production
*/
public Producer(Production production) {
// TODO 传入公共资源对象
this.production=production;
}
public void run() {
while(true) {
try {
production.produce();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* @ClassName: Consumer
* @Description: TODO 消费线程
* @author Qiongjie
* @date 17-08-07 4:16:42 PM
*/
class Consumer implements Runnable{
Production production;
/**
* <p>构造函数: Consumer</p>
* <p>Description: 传入公共资源对象</p>
* @param production
*/
public Consumer(Production production) {
// TODO 传入公共资源对象
this.production=production;
}
public void run() {
while (true) {
try {
production.consume();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* @ClassName: Test
* @Description: TODO 运行测试类
* @author Qiongjie
* @date 17-08-07 4:06:56 PM
*/
public class Test {
public static void main(String[] args) {
Production production=new Production();//创建公共资源
new Thread(new Producer(production)).start();//利用公共资源创建生产线程并启动
new Thread(new Consumer(production)).start();//利用公共资源创建消费线程并启动
}
}