SynchronousQueue的疑问

luqing414 2015-11-02 03:41:44
缓冲队列采用 SynchronousQueue,它将任务直接交给线程处理而不保持它们。如果不存在可用于立即运行任务的线程(即线程池中的线程都在工作),则试图把任务加入缓冲队列将会失败,因此会构造一个新的线程来处理新添加的任务,并将其加入到线程池中。直接提交通常要求无界 maximumPoolSizes(Integer.MAX_VALUE) 以避免拒绝新提交的任务。newCachedThreadPool采用的便是这种策略。



这是网上找的关于SynchronousQueue的一段话,我的疑问有2个:
1. 他说的“缓冲队列采用 SynchronousQueue,它将任务直接交给线程处理而不保持它们”,这个不保持它们是什么意思,SynchronousQueue这个缓冲队列到底里面会存放任务吗,什么情况会存放,又什么时候被取出

2. 他说的“如果不存在可用于立即运行任务的线程(即线程池中的线程都在工作),则试图把任务加入缓冲队列将会失败”,这句话反过来理解,如果存在可用于立即运行任务的线程,那就会成功把任务加入SynchronousQueue吗?既然有空闲的线程,直接让线程运行任务不就完了吗,还需要把任务加入SynchronousQueue吗?
...全文
220 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
@summer@ 2019-08-16
  • 打赏
  • 举报
回复
1.首先SynchronousQueue里面是不存任务的,也就是说当一个线程试图put的时候,必须有另一个线程正在talk。就是你想往队列里面放东西的时候必须有另一个人正在盯着,这样你就可以直接交给另一个人了,当没人盯着的时候(没有线程正在talk或者线程正在处理后面的逻辑)就会报错。 2.你的第二个问题有点外行l了,当然是SynchronousQueue判断有没有空闲的线程啊,不然谁给你判断,SynchronousQueue他本身不存这个任务,只是判断有空闲线程的话转发给他,就像你的方法传值一样
奕聪 2016-03-18
  • 打赏
  • 举报
回复
兄弟这两个问题我也有纳闷,但是还没有想到为什么
luqing414 2015-11-03
  • 打赏
  • 举报
回复
没人知道吗?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧