主方法開啟線程
生產者生產連接 ,消費者獲取連接
/**
* 線程池阻塞隊列
*/
public class Test {
public static void main(String[] args) {
BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<String>(10);
ProducerThread producerThread = new ProducerThread(blockingQueue);
ConsumerThread consumerThread = new ConsumerThread(blockingQueue);
Thread p = new Thread(producerThread);
Thread c = new Thread(consumerThread);
p.start();
c.start();
try {
//等待10秒
Thread.sleep(1000*10);
} catch (InterruptedException e) {
e.printStackTrace();
}
producerThread.stop();
}
}
生產者線程
/**
* 生產者添加隊列
*/
class ProducerThread implements Runnable{
public BlockingQueue<String> blockingQueue;
public volatile Boolean FLAG = true;
AtomicInteger atomicInteger =new AtomicInteger();
public ProducerThread(BlockingQueue<String> blockingQueue){
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
System.out.println("生產者線程已經啟動");
try {
while (FLAG){
//i++的意思,保證安全
String data = atomicInteger.incrementAndGet() +"";
boolean offer = blockingQueue.offer(data,2, TimeUnit.SECONDS);
if (offer){
System.err.println("生產者存入隊列成功!data:" + data);
}else {
System.err.println("生產者存入隊列失敗!data:" + data);
}
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("生產者生產結束");
}
}
//線程停止
public void stop(){
this.FLAG = false;
}
}
消費者線程
/**
* 消費者消費隊列
*/
class ConsumerThread implements Runnable{
public BlockingQueue<String> blockingQueue;
public volatile Boolean FLAG = true;
AtomicInteger atomicInteger =new AtomicInteger();
public ConsumerThread(BlockingQueue<String> blockingQueue){
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
System.out.println("消費者線程啟動");
try {
while (FLAG){
String data = blockingQueue.poll(2, TimeUnit.SECONDS);
if (data == null){
System.out.println("超過兩秒時間沒有獲取到");
FLAG = false;
return;
}
System.out.println("消費者獲取隊列data:"+data);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("消費結束");
}
}
}
引用的包
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
圖片分析
image.png