多執行緒模擬實現生產者/消費者模型
阿新 • • 發佈:2018-12-04
多執行緒模擬實現生產者/消費者模型
package com.chow.queue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Created by zhouhaiming on 2017-5-26 17:21
* Email: [email protected]
*
* @Description:多執行緒模擬實現生產者/消費者模型
*/
public class BlockingQueueTest2 {
/**
* 定義裝蘋果的籃子
*/
public class Basket {
// 籃子,能夠容納3個蘋果
BlockingQueue<String> basket = new LinkedBlockingQueue<String>(3);
// 生產蘋果,放入籃子
public void produce() throws InterruptedException {
// put方法放入一個蘋果,若basket滿了,等到basket有位置
basket.put("An apple");
}
// 消費蘋果,從籃子中取走
public String consume() throws InterruptedException {
// take方法取出一個蘋果,若basket為空,等到basket有蘋果為止(獲取並移除此佇列的頭部)
return basket.take();
}
}
// 定義蘋果生產者
class Producer implements Runnable {
private String instance;
private Basket basket;
public Producer(String instance, Basket basket) {
this.instance = instance;
this.basket = basket;
}
public void run() {
try {
while (true) {
// 生產蘋果
System.out.println("生產者準備生產蘋果:" + instance);
basket.produce();
System.out.println("!生產者生產蘋果完畢:" + instance);
// 休眠300ms
Thread.sleep(300);
}
} catch (InterruptedException ex) {
System.out.println("Producer Interrupted");
}
}
}
// 定義蘋果消費者
class Consumer implements Runnable {
private String instance;
private Basket basket;
public Consumer(String instance, Basket basket) {
this.instance = instance;
this.basket = basket;
}
public void run() {
try {
while (true) {
// 消費蘋果
System.out.println("消費者準備消費蘋果:" + instance);
System.out.println(basket.consume());
System.out.println("!消費者消費蘋果完畢:" + instance);
// 休眠1000ms
Thread.sleep(1000);
}
} catch (InterruptedException ex) {
System.out.println("Consumer Interrupted");
}
}
}
public static void main(String[] args) {
BlockingQueueTest2 test = new BlockingQueueTest2();
// 建立一個裝蘋果的籃子
Basket basket = test.new Basket();
ExecutorService service = Executors.newCachedThreadPool();
Producer producer = test.new Producer("生產者001", basket);
Producer producer2 = test.new Producer("生產者002", basket);
Consumer consumer = test.new Consumer("消費者001", basket);
service.submit(producer);
service.submit(producer2);
service.submit(consumer);
// 程式執行5s後,所有任務停止
// try {
// Thread.sleep(1000 * 5);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// service.shutdownNow();
}
}