码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-19 20:56:35      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:synchronousqueue和阻塞队   synchronousqueue的使用场   

阅读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

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

标签:synchronousqueue和阻塞队   synchronousqueue的使用场   

原文地址:http://blog.csdn.net/aitangyong/article/details/38684831

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!