首页 > 代码库 > 似懂非懂的SynchronousQueue和长度为1的BlockingQueue

似懂非懂的SynchronousQueue和长度为1的BlockingQueue

阅读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的阻塞队列,则不能达到此效果。