阻塞队列用处:生产者消费者模式、线程池、消息中间件
7种阻塞队列 重点使用标红
阻塞队列核心方法
put和take取不到会阻塞
package com.example.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
/**
* @author chenxf 阻塞队列演示
* @create 2021-08-02 20:47
* SyschronousQueue没有容量
* 与其他BlockingQueue不同,SyschronousQueue是一个不存储元素的BlockingQueue
* 每一个put操作必须要等待一个take操作,否则不能继续添加元素,反之亦然。
*/
public class SynchronousQueueDemo {
public static void main(String[] args) {
BlockingQueue<String> blockingQueue = new SynchronousQueue<>();
List list = new ArrayList();
new Thread(()->{
try {
System.out.println((Thread.currentThread().getName() + "\t put 1"));
blockingQueue.put("1");
System.out.println((Thread.currentThread().getName() + "\t put 2"));
blockingQueue.put("2");
System.out.println((Thread.currentThread().getName() + "\t put 3"));
blockingQueue.put("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "AAA").start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(5);
System.out.println((Thread.currentThread().getName() + "\t " + blockingQueue.take()));
TimeUnit.SECONDS.sleep(5);
System.out.println((Thread.currentThread().getName() + "\t " + blockingQueue.take()));
TimeUnit.SECONDS.sleep(5);
System.out.println((Thread.currentThread().getName() + "\t " + blockingQueue.take()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "BBB").start();
}
}