我们应该为长时间运行的线程使用线程池还是启动我们自己的线程?有一些设计模式吗?
问问题
1498 次
1 回答
3
不幸的是,这取决于。没有硬性规定说您应该始终使用线程池。
线程池提供了两个主要功能:
- 线程的委托创建/重用。
- 背压
IMO,有趣的是背压属性,但通常是最不了解的。您的机器在有限的资源集上运行。如果您有(例如)8 个 CPU 内核并且它们都在忙于工作,那么您想以某种方式表明添加更多工作(提交更多任务)不会有帮助,至少在延迟方面没有帮助。
这就是java.util.concurrent.ExecutorService
实现允许您指定java.util.concurrent.BlockingQueue
您选择的原因的原因。当此队列变满时,调用线程将阻塞,直到线程池设法完成正在进行的任务。
线程池中是否有长时间运行的线程取决于它在做什么。如果线程一直很忙(意味着它永远不会完成),那么它总是会占用线程池中的一个槽,这有点毫无意义。
关于线程的委托创建/重用;也许你可以有两个池,一个用于长时间运行的任务,一个用于其他任务。或者也许是一个带有一个插槽的长时间运行的线程池,这将防止两个长时间运行的任务同时运行,只要这是你想要的。
如您所见,没有一个好的答案。这实际上归结为您要实现的目标以及您希望如何使用手头的资源。
于 2015-09-16T12:18:46.923 回答