package com.zl.thread;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author zhanglei
* @description :
* @date 2021/4/7$ 13:54$
* @return $
*/
public class BlockQueeDemo {
public static void main(String[] args) throws InterruptedException {
BlockingQueue queue = new LinkedBlockingQueue();
ProduceThread p = new ProduceThread(queue);
ConsumeThread c = new ConsumeThread(queue);
p.start();
c.start();
Thread.sleep(5*1000);
p.stopThread();
//c.stopThread();
}
}
class ProduceThread extends Thread{
BlockingQueue queue;
private volatile boolean flag = true; //添加可见性,用于停止线程
private static AtomicInteger count = new AtomicInteger(); //线程安全Integer类
ProduceThread(BlockingQueue queue){
this.queue = queue;
}
@Override
public void run() {
try{
while(flag){
String data = count.incrementAndGet()+"";
queue.offer(data,2,TimeUnit.SECONDS); //2秒阻塞写入数据,2秒后就写不进去了
System.out.println("生产者线程生产数据:"+data);
Thread.sleep(1000);
}
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println("生产者线程结束");
}
}
public void stopThread(){
this.flag = false;
}
}
class ConsumeThread extends Thread{
BlockingQueue queue;
private volatile boolean flag = true;
ConsumeThread(BlockingQueue queue){
this.queue = queue;
}
@Override
public void run() {
try{
while(flag){
Object poll = queue.poll(2, TimeUnit.SECONDS);//2秒内获取不到数据返回null
if(poll == null){
System.out.println("消费者2秒内未消费到数据,停止线程");
flag = false;
}else{
System.out.println("消费者消费数据:"+poll);
Thread.sleep(1000);
}
}
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println("消费者线程结束");
}
}
public void stopThread(){
this.flag = false;
}
}
运行结果:
生产者线程生产数据:1
消费者消费数据:1
生产者线程生产数据:2
消费者消费数据:2
生产者线程生产数据:3
消费者消费数据:3
生产者线程生产数据:4
消费者消费数据:4
生产者线程生产数据:5
消费者消费数据:5
生产者线程结束
消费者2秒内未消费到数据,停止线程
消费者线程结束