當緩衝區(資源存儲)爲空時,消費者阻塞等待;
當緩衝區滿了時,生產者阻塞等待;
package test;
import java.text.MessageFormat;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author sgs
* @date 2018年7月27日
*/
public class test1 {
public static void main(String[] args) throws InterruptedException {
// 創建阻塞隊列
LinkedBlockingDeque<abc> linkedBlockingDeque = new LinkedBlockingDeque<>();
Producer p1 = new Producer(linkedBlockingDeque);
Producer p2 = new Producer(linkedBlockingDeque);
Producer p3 = new Producer(linkedBlockingDeque);
Consumer c1 = new Consumer(linkedBlockingDeque);
Consumer c2 = new Consumer(linkedBlockingDeque);
Consumer c3 = new Consumer(linkedBlockingDeque);
// 創造線程池
ExecutorService service = Executors.newCachedThreadPool();
service.execute(p1);
service.execute(p2);
service.execute(p3);
service.execute(c1);
service.execute(c2);
service.execute(c3);
Thread.sleep(1000);
p1.stop();
p2.stop();
p3.stop();
Thread.sleep(3000);
// 停止線程池工作,已有的線程完成後結束
service.shutdown();
}
}
// 生產者
class Producer implements Runnable{
// 運行標識
private volatile boolean isRunning = true;
// 內存緩衝區
private BlockingQueue<abc> blockingQueue;
// 總數 原子操作
private static AtomicInteger count = new AtomicInteger();
// 睡眠時間
private static final int SLEEPTIME = 1000;
public Producer(BlockingQueue<abc> blockingQueue) {
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
// 生成隨機數
Random random = new Random();
abc abc = null;
try {
while (isRunning) {
System.out.println("生產者 NAME: " + Thread.currentThread().getName() +" ID:"+ Thread.currentThread().getId());
Thread.sleep(random.nextInt(SLEEPTIME));
abc = new abc();
// 以原子方式將當前值加 1
abc.setAge(count.incrementAndGet());
System.out.println("生產者:" + abc.getAge() );
// 如果超時(blockingQueue.offer)超過2秒
if(!blockingQueue.offer(abc, 2, TimeUnit.SECONDS)) {
System.out.println(abc + "超時");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop() {
isRunning = false;
}
}
// 消費者
class Consumer implements Runnable{
private BlockingQueue<abc> blockingQueue;
private static final int SLEEPTIME = 1000;
public Consumer(BlockingQueue<abc> blockingQueue){
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
System.out.println("消費者NAME :" + Thread.currentThread().getName() +" ID:"+ Thread.currentThread().getId());
Random r = new Random();
try{
while(true){
// 移除阻塞(take())
abc abc = blockingQueue.take();
if(abc != null)
{
int age = abc.getAge();
// MessageFormat.format格式化消息,根據{}填寫數據
// System.out.println(MessageFormat.format("{0}",age));
System.out.println("消費者:" + age);
Thread.sleep(r.nextInt(SLEEPTIME));
}
}
}catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
class abc{
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}