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个元素
消费者停止工作