线程问题

现在是这样一个问题:
有一个队列,然后队列里面会有任务。然后有一个模块会从这个队列里取走任务,执行。
现在有二种设计:
一种是开指定个数个线程轮询这个队列。取到任务后执行。执行完再轮询。
一种是开一个线程去轮询队列,取到任务后组装成一个Runbale对象交给执行线程池执行。当然执行线程池也限制了任务的最大数目。剩余的在线程池里面排队。
只对着二种设计做比较。哪种较好。理由。

第一种复杂,不推荐。队列会被多个线程竞争,这样就要同步线程,搞不好就会死锁。

第二种是一般做法,相比第一种没有资源竞争的情况。而且JDK1.5中已经实现了,利用BlockingQueue和Executor框架很容易搞定。

单从你提出的这两个方案来看,第二个比较合理。
原因:第一种方案你要开启多个线程取轮询一个队列这样你要加标记的,来判断队列中每个任务当前的状态,之后作出相应的操作,比较麻烦。

个人感觉两个各有好处:
第一种:多个消费者同时竞争任务队列,取到后即可执行,执行完后重新获取。这里需要考虑的问题只是任务队列的同步问题。。
第二种:消费者只是单纯的轮训任务队列, 不存在任务队列的同步问题, 消费者只是简单的将任务加到线程池中, 其他交由线程池完成,这里会有两个问题:
1》 最初消费者轮训期间, 线程池中的线程可能会出在饥饿状态
2》 如果消费者轮训的时间较长, 或者线程池中任务执行的较快, 会导致线程池中线程空等等低效的状态。。。
:oops: so 小菜建议使用第一种方式。。。

亲,个人看好第一种方案。第一种方案可以实现多个任务同时执行。再者,第二种方案线程池中任务超过核心线程数时,本身就在任务队列中。你为何不直接把你的任务队列直接丢给线程池,又何必搞个线程轮询任务队列,再交给线程池呢?

第一种简单点
第二种灵活些

可以把两个方案结合起来
第一步:总线程轮询任务池,发现有任务.(比如1分钟的timer)
第二步:总线程发现小三闲着.让小三去工作.
第三步:小三开始干活
第四步:小三干完活,继续去取任务.没有就闲着.

第二种更合理,第二种可以复用线程和监控线程。第一种启动了几个线程如果任务干完了,线程就没用了,而第二种线程池里的线程还能干其他的事情,并且通过线程池的监控参数,可以观察现在的线程数是否合理。

应该使用第二种方法:

  第一种多个线程同时去争资源的话。会因为队列的同步造成 效率的低下。


  第二种一个线程去取分配不会存在同步问题,就这一点效率会比第一种好,你说的

取到任务后组装成一个Runbale对象交给执行线程池执行。当然执行线程池也限制了任务的最大数目。剩余的在线程池里面排队

这个就问题你只把你线程池的策略设好就可以了。而且这种比较第一种不定时起动线程更能少资源。更有效率一点。。。

:D

直接BlockingQueqe + 线程池即可啊。

Jms异步添加消息,BlockingQueue+Executor获取队列。

单纯从程序上来说
1、第一种设计需要一开始就要去启动n个线程,第二种设计只需要启动一个线程,需要的时候才会去启动最大N个线程去处理
2、第一种设计多个线程去同时轮询一个队列就会有同步问题,第二种设计没有
3、第二种设计可以给程序带来更多的可控性

第二种设计比较好