在 Java 的队列中有一个比较特殊的队列 SynchronousQueue,它的特别之处在于它内部没有容器,每次进行 put() 数据后(添加数据),必须等待另一个线程拿走数据后才可以再次添加数据,它的使用示例如下:
import java.util.concurrent.SynchronousQueue; public class SynchronousQueueTest { public static void main(String[] args) { SynchronousQueue queue = new SynchronousQueue(); // 入队 new Thread(() -> { for (int i = 0; i < 3; i++) { try { System.out.println(new Date() + ",元素入队"); queue.put("Data " + i); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); // 出队 new Thread(() -> { while (true) { try { Thread.sleep(1000); System.out.println(new Date() + ",元素出队:" + queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }以上代码的执行结果如下:
Mon Oct 19 21:00:21 CST 2020,元素入队
Mon Oct 19 21:00:22 CST 2020,元素出队:Data 0
Mon Oct 19 21:00:22 CST 2020,元素入队
Mon Oct 19 21:00:23 CST 2020,元素出队:Data 1
Mon Oct 19 21:00:23 CST 2020,元素入队
Mon Oct 19 21:00:24 CST 2020,元素出队:Data 2
从上述结果可以看出,当有一个元素入队之后,只有等到另一个线程将元素出队之后,新的元素才能再次入队。
总结本文讲了 Java 中的 5 种队列:普通队列、双端队列、优先队列、延迟队列、其他队列。其中普通队列的典型代表为 ArrayBlockingQueue 和 LinkedBlockingQueue,双端队列的代表为 LinkedBlockingDeque,优先队列的代表为 PriorityQueue,延迟队列的代表为 DelayQueue,最后还讲了内部没有容器的其他队列 SynchronousQueue。