使用线程池有什么缺点吗?

时间:2014-03-26 13:55:28

标签: java multithreading threadpool

我知道线程池是一件好事,因为它可以重用线程,从而节省创建新线程的成本。但我的问题是,使用线程池有什么缺点吗?在哪种情况下使用的线程池不如仅使用单个线程一样好?

7 个答案:

答案 0 :(得分:6)

  

在哪种情况下使用的线程池不如仅使用单个线程一样好?

我唯一能想到的就是你有一个单一的线程,只需要在你的程序生命周期内完成一个任务。类似于附加到永久缓存或其他东西的后台线程。这是我唯一一次直接分叉线程而不是使用ExecutorService。即使这样,使用Executor.newSingleThreadExecutor()也没关系。

当然,只要您需要多个线程来执行任务,就必须保证线程池。 ExecutorService代码的作用是减少为管理线程而需要编写的代码量。可读性和代码可维护性的改进是一个巨大的胜利。

答案 1 :(得分:3)

Threadpool仅适用于需要较少时间才能完成的操作。 Threadpool线程不适合长时间运行的操作,因为它很容易导致线程不足。

如果您要求您的线程具有特定的优先级,则线程池线程不适合。

您的任务导致线程长时间阻塞。线程池具有最大线程数,因此大量被阻塞的线程池线程可能会阻止任务启动。

答案 2 :(得分:1)

除了格雷的回答。

其他用例是如果您使用线程本地或使用线程作为某种哈希表的键或线程的有状态自定义实现。在这种情况下,即使失败,您也必须关心使用线程完成特定任务时的状态。否则一些意外是可能的:使用具有某种状态的线程的下一个任务可能会开始运行错误。

答案 3 :(得分:1)

如果在其上运行的任务通过阻塞队列交换信息,则有限大小的线程池是危险的 - 这可能导致线程不足:What is starvation?。好的规则是永远不要在线程池上运行的任务中使用阻塞操作。

答案 4 :(得分:1)

你在这里得到了许多不同的答案。我认为其中一个原因是问题不完整。您要求使用线程池的缺点,"但你没有说,与是什么相比有哪些缺点?

线程池解决了特定问题。还有其他问题,其中"线程"或者"线程"是解决方案的一部分,但"线程池"不是。 "线程池"当问题是,如何在多处理器系统上实现许多短暂的,CPU密集型任务的并行执行时,通常就是答案。

即使在单处理器上,线程也可用于其他目的。我问的关于任何长期运行的线程的第一个问题是,#34;它等待什么。"线程是组织必须等待不同类型事件的程序的绝佳工具。但是,你不会使用线程池。

答案 5 :(得分:0)

当您不打算停止使用该主题时,Theads会更好。例如在无限循环中。线程池最好是在完成许多不会同时发生的任务时。特别是当任务很短时,使用相同线程的开销和清晰度会更大。

答案 6 :(得分:0)

这取决于你要利用线程池的情况。例如,如果您的系统不需要并行执行任务,则不会使用线程池。它会为不会发生的工作保留不必要的线程。在这种情况下,您无论如何都可以使用SingleThreadExecutor。如果您没有对此进行澄清,请查看此链接:Thread Pool Pattern