阅读ArrayBlockingQueue源码,很容易知道有界阻塞队列的长度至少为1,也就是至少能缓存下一个数据。SynchronousQueue的javadoc文档提到A synchronous queue does not have any internal capacity, not even a capacity of one.也就说同步队列的容量是0,不会缓存数据。
长度为1的阻塞队列和SynchronousQueue都能够实现以下效果:插入数据的线程和获取数据的线程,交替执行。
public class TestSynchronousQueue { private static SynchronousQueue<String> queue = new SynchronousQueue<String>(); public static void main(String[] args) throws Exception { new Productor().start(); new Productor().start(); System.out.println("Productors are blocked."); // new Consumer().start(); } static class Productor extends Thread { @Override public void run() { try { queue.put("11"); System.out.println("put success."); } catch (InterruptedException e) { e.printStackTrace(); } } } static class Consumer extends Thread { @Override public void run() { try { String v = queue.take(); System.out.println("take success." + v); } catch (InterruptedException e) { e.printStackTrace(); } } } }
如果使用同步队列,2个生产者都会被阻塞;如果使用长度为1的有界队列,只有1个生产者会被阻塞。不知道这些差别背后隐藏着什么,不太明白同步队列的使用场景,有知道的兄弟,欢迎回帖。
Executors.newCachedThreadPool()中使用到了同步队列,目的就是保证“对于提交的任务,如果有空闲线程,则使用空闲线程来处理;否则新建一个线程来处理任务”。如果使用长度为1的阻塞队列,则不能达到此效果。
似懂非懂的SynchronousQueue和长度为1的BlockingQueue,布布扣,bubuko.com
时间: 2024-10-16 05:19:55