package com.hangzhou.springcloud.service.impl;
import com.alibaba.fastjson.JSON;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 阻塞隊列生產者、消費者模式
*/
public class ProducerConsumerTest {
public static void main(String[] args) {
ProducerConsumer<String> producerConsumer = new ProducerConsumer<>(new LinkedBlockingQueue<>(100), "test");
new Thread(() -> {
producerConsumer.producer();
}, "生產者線程").start();
new Thread(() -> {
producerConsumer.consumer();
}, "消費者線程").start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("");
System.out.println("");
System.out.println("");
System.out.println("任務即將結束");
producerConsumer.stop();
}
}
class ProducerConsumer<T> {
private volatile boolean flag = true;
private volatile boolean stop = false;
private BlockingQueue<T> blockingQueue;
private AtomicInteger producerInteger = new AtomicInteger(0);
private AtomicInteger consumerInteger = new AtomicInteger(0);
private T t;
public ProducerConsumer(BlockingQueue<T> blockingQueue, T t) {
this.blockingQueue = blockingQueue;
this.t = t;
}
public void producer() {
//多線程併發,不能用if判斷,避免出現併發異常
while (flag) {
try {
blockingQueue.offer(t, 2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
producerInteger.incrementAndGet();
System.out.println(Thread.currentThread().getName() + "生產元素" + JSON.toJSONString(t) + "成功");
if (stop) {
try {
//爲了消費者消費
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = false;
System.out.println("生產者生產了" + producerInteger.get() + "個元素");
System.out.println("生產者停止工作");
return;
}
}
}
public void consumer() {
while (flag) {
//隊列裏面沒有元素,默認返回null
T take = null;
try {
take = blockingQueue.poll(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (null != take) {
consumerInteger.incrementAndGet();
System.out.println("消費者取出的元素爲:" + JSON.toJSONString(take));
} else {
//最後一個取出是null值,說明消費結束
System.out.println("消費者消費了" + consumerInteger.get() + "個元素");
System.out.println("消費者停止工作");
flag = false;
return;
}
}
}
public void stop() {
stop = true;
}
}
打印結果:
生產者線程生產元素"test"成功
生產者線程生產元素"test"成功
任務即將結束
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
生產者線程生產元素"test"成功
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
消費者取出的元素爲:"test"
生產者生產了350762個元素
生產者停止工作
消費者消費了350762個元素
消費者停止工作