为什么ScheduledThreadPoolExecutor只接受固定数量的线程?

Mat*_*hew 31 java threadpool

我可以想象一些任务计划花费很长时间,并ScheduledThreadPoolExecutor为其他需要运行的任务创建额外的线程,直到达到最大线程数.

但似乎我只能为池指定固定数量的线程,为什么会这样呢?

ext*_*eon 11

作为原因,我也不知道.但我可以想象.

计算机的资源量有限.并非所有资源都可以同时处理.

如果多个进程同时加载文件,它们的加载速度将比顺序加载(至少在硬盘上).

处理器对同时处理多个线程的支持也有限.在某些时候,操作系统或JVM将花费更多时间来切换线程,而不是线程花费在执行代码上.

这是ScheduledThreadPoolExecutor设计方式的一个很好的理由.您可以在队列中放置任意数量的作业,但是从不会同时执行比可以有效运行的更多作业.当然,由你来平衡.

如果您的任务是IO绑定的,我会将池大小设置得很小,如果它们是CPU绑定的,则会稍微大一点(大约32个).您还可以创建多个ScheduledThreadPoolExecutors,一个用于IO绑定任务,一个用于CPU绑定任务.


YoK*_*YoK 7

在进一步深入了解SchecduledThreadPoolExecutor时,我找到了这个链接,这个链接解释了SchecduledThreadPoolExecutor解决了Timer类的许多问题.并且引入SchecduledThreadPoolExecutor的原因是替换Timer(由于Timer的各种问题).我认为传递给SchecduledThreadPoolExecutor的固定线程数的原因是这个类解决的问题之一.即

Timer类只启动一个线程.虽然它比每个任务创建一个线程更有效,但它不是最佳解决方案.最佳解决方案可以是在一个线程之间为所有任务使用多个线程,在每个任务中使用一个线程.实际上,最佳解决方案是将任务放在线程池中.在构造期间,池中的线程数应该是可分配的,以允许程序确定池中的最佳线程数.

所以在我看来,这是SchecduledThreadPoolExecutor的用例来自何处.在您的情况下,您应该能够根据您计划安排的任务以及完成这些任务所需的时间来确定最佳值.如果我有4个长时间运行的任务被安排在同一时间,我宁愿我的池大小大于4,如果有其他任务在同一时间执行.如前面的答案中所示,我还希望在不同的执行程序中分离长时间运行的任务.

希望这可以帮助 :)