什么是阻塞队列BlockingQueue
类图
核心方法
常用阻塞队列
ArrayBlockingQueue
由一个数组结构组成的有界Integer.MAX_VALUE阻塞队列
LinkedBlockingQueue
由一个链表结构组成的有界Integer.MAX_VALUE阻塞队列
SynchronousQueue
/ˈsɪŋkrənəs kjuː/ 一个不存储元素的阻塞队列。每一个put操作都要等待take操作,反之亦然。
代码演示
BlockingQueue<Integer> queue = new SynchronousQueue();
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName() + " put 1");
queue.put(1);
System.out.println(Thread.currentThread().getName() + " put 2");
queue.put(2);
System.out.println(Thread.currentThread().getName() + " put 3");
queue.put(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "a").start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName() + " " + queue.take());
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName() + " " + queue.take());
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName() + " " + queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "b").start();
}
结果分析:
空行表示每3秒打印
a put 1
b 1
a put 2
b 2
a put 3
b 3
Java并发编程艺术P167