什么情况下我们会使用 阻塞队列: 多线程并发处理, 线程池!
四组API:
SynchronousQueue 同步队列:
没有容量,
进去一个元素,必须等待取出来之后,才能再往里面放一个元素!
和其他的BlockingQueue 不一样, SynchronousQueue 不存储元素
put了一个元素,必须从里面先take取出来,否则不能在put进去值!
BlockingQueue<String> blockingQueue = new SynchronousQueue<>(); // 同步队列
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
class test1{
public static void main(String[] args) {
BlockingQueue<String> blockingQueue = new SynchronousQueue<>(); // 同步队列
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+" put 1");
blockingQueue.put("1");
System.out.println(Thread.currentThread().getName()+" put 2");
blockingQueue.put("2");
System.out.println(Thread.currentThread().getName()+" put 3");
blockingQueue.put("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
},"T1").start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+" take "+blockingQueue.take());
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+" take "+blockingQueue.take());
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+" take "+blockingQueue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
},"T2").start();
}
}
// 输出结果
T1 put 1
T2 take 1
T1 put 2
T2 take 2
T1 put 3
T2 take 3