Java - 管理线程池的大小(主要增加)

时间:2012-03-22 16:23:28

标签: java threadpool

我正在尝试在Java中使用线程池。但是线程的数量是未知的,所以我试图找到一个解决方案。然后出现了两个问题:

  1. 我正在寻找一段时间以来增加线程池的大小,但我还是想不出一些东西。有什么建议吗?有人说Executors.newCachedThreadPool()应该有效,但在方法的定义中,它表示它适用于短时间线程。

  2. 如果我将线程池的大小设置为50或100之类的大数字怎么办?它运作正常吗?

2 个答案:

答案 0 :(得分:3)

  1. 您也可以使用Executors.newCachedThreadPool来执行更长期的任务,但问题是,如果您有长时间运行的任务,并且它们不断添加并且比现有任务更频繁地添加,那么线程将失去控制。在这种情况下,最好使用(较大的)固定大小的线程池,让其他任务在队列中等待一个空闲线程。

  2. 这只会意味着你(可能)大部分时间都有大量处于休眠状态的活动线程。基本上要考虑的事情是

    • 您的系统可以处理多少个线程(即,总共可以创建多少个线程,在Windows机器中,这可以少于1000个,在Linuces中,您可以获得数万个线程,甚至可以通过一些调整获得更多线程系统配置)
    • 每个线程在内存方面至少消耗单个线程的堆栈大小(在Linux中,默认情况下,这可能类似于每个线程1-8MB,同样可以从ulimits和JVM的{{1}调整} -parameter)
    • 至少对于NPTL,睡眠线程应该有最小或几乎为零的上下文切换惩罚,因此多余的线程在cpu使用方面并不“重”
  3. 话虽这么说,但最好直接使用ThreadPoolExecutor的构造函数来获得所需的池。

答案 1 :(得分:2)

Executors.newCachedThreadPool()允许您根据需求创建线程。我想你可以从使用它开始 - 我无法看到它表示它适用于短时间线程,但我敢打赌原因是因为你重新使用可用线程,拥有短线程可以让你保持同时活动的数量线程很低。

除非您运行的线程太多(您可以使用JVisualVM或JConsole进行检查),否则我建议坚持使用该解决方案 - 特别是因为预期线程的数量未定义。然后分析VM并相应地调整池。

对于问题2 - 您指的是使用类似Executors.newFixedThreadPool(int)的内容吗?如果是,请记住,当您创建ThreadPool时,确定您定义的线程数将使线程等待 - 而不是动态创建新线程的newCachedThreadPool