我正在尝试在Java中使用线程池。但是线程的数量是未知的,所以我试图找到一个解决方案。然后出现了两个问题:
我正在寻找一段时间以来增加线程池的大小,但我还是想不出一些东西。有什么建议吗?有人说Executors.newCachedThreadPool()
应该有效,但在方法的定义中,它表示它适用于短时间线程。
如果我将线程池的大小设置为50或100之类的大数字怎么办?它运作正常吗?
答案 0 :(得分:3)
您也可以使用Executors.newCachedThreadPool来执行更长期的任务,但问题是,如果您有长时间运行的任务,并且它们不断添加并且比现有任务更频繁地添加,那么线程将失去控制。在这种情况下,最好使用(较大的)固定大小的线程池,让其他任务在队列中等待一个空闲线程。
这只会意味着你(可能)大部分时间都有大量处于休眠状态的活动线程。基本上要考虑的事情是
话虽这么说,但最好直接使用ThreadPoolExecutor的构造函数来获得所需的池。
答案 1 :(得分:2)
Executors.newCachedThreadPool()
允许您根据需求创建线程。我想你可以从使用它开始 - 我无法看到它表示它适用于短时间线程,但我敢打赌原因是因为你重新使用可用线程,拥有短线程可以让你保持同时活动的数量线程很低。
除非您运行的线程太多(您可以使用JVisualVM或JConsole进行检查),否则我建议坚持使用该解决方案 - 特别是因为预期线程的数量未定义。然后分析VM并相应地调整池。
对于问题2 - 您指的是使用类似Executors.newFixedThreadPool(int)
的内容吗?如果是,请记住,当您创建ThreadPool
时,确定您定义的线程数将使线程等待 - 而不是动态创建新线程的newCachedThreadPool
。