java线程池如何实现任务的挂起?

a12939026 2014-09-07 10:38:49
就是如果在wait的时候,是把整个线程挂起,是否可以做到只把任务挂起呢?
这样可能导致的问题比如:在生产消费中,线程池比如开了4个线程,但是有4个生产者在等待,把4个工作线程都占满了。
其实整个时候已经有消费者在等着唤醒他们了,但是由于线程池已满,导致不能消费者不能执行,最终死锁。
...全文
485 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxsmzzwa 2014-09-07
  • 打赏
  • 举报
回复
考虑一个简单的线程池: 有工作队列,和工作线程 一般工作线程是内部类,总是不停的拿任务,然后执行。 如果工作队列为空,则等待。 线程重复开销大,线程池主要用来解决。 比如有1000000个消费者,和1000000个生产者 可以这样设计,开二个线程池各开10个线程,共享一个阻塞队列。 第一个线程池可以都是消费者,第二个都是生产者,OK。 工作线程经常扮演消费者角色。 感觉兴趣的话,可以举一个例子,生产者消费者,最点在那个阻塞队列。
rumlee 2014-09-07
  • 打赏
  • 举报
回复
既然用了线程池,那当然就应该只能挂起任务,不能直接挂起线程。 至于如何挂起任务而且归还线程那就得你编程来实现了。
a12939026 2014-09-07
  • 打赏
  • 举报
回复
哈哈 谢谢大家。 可能我有点想多了。。
skgary 2014-09-07
  • 打赏
  • 举报
回复
引用 楼主 a12939026 的回复:
就是如果在wait的时候,是把整个线程挂起,是否可以做到只把任务挂起呢? 这样可能导致的问题比如:在生产消费中,线程池比如开了4个线程,但是有4个生产者在等待,把4个工作线程都占满了。 其实整个时候已经有消费者在等着唤醒他们了,但是由于线程池已满,导致不能消费者不能执行,最终死锁。
你的逻辑应该不成立。 首先,生产者和消费者任何一方都不可能占全线程池,甚至是生产者和消费者都不应该用同一个线程池。 再者,你消费者没有任务的时候在干什么呢?难道不是在wait()么?还是按你的说法,应该都没有在run的loop里面? 如果是在wait的状态,那么只要有东西可消费,那么应该立即被notify才对,所以也不应该死锁啊

62,614

社区成员

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

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