首页 > 代码库 > 似懂非懂的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的阻塞队列,则不能达到此效果。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。