Java Executor ScheduledThreadPool“更多”线程池的影响是什么?

Java Executor ScheduledThreadPool“更多”线程池的影响是什么?,java,multithreading,threadpool,executorservice,threadpoolexecutor,Java,Multithreading,Threadpool,Executorservice,Threadpoolexecutor,我有一个实现runnable接口的类的3个实例。我正在实例化我的Executor类,如下所示 executor = Executors.newScheduledThreadPool(2);<--- talking about this part executor.scheduleAtFixedRate(unassignedRunnable, 0, refreshTime, TimeUnit.SECONDS); executor.scheduleAtFixedRate(as

我有一个实现runnable接口的类的3个实例。我正在实例化我的Executor类,如下所示

 executor = Executors.newScheduledThreadPool(2);<--- talking about this part
    executor.scheduleAtFixedRate(unassignedRunnable, 0, refreshTime, TimeUnit.SECONDS);
    executor.scheduleAtFixedRate(assignedToMeRunnable, 2, refreshTime, TimeUnit.SECONDS);
    executor.scheduleAtFixedRate(createTicketsFromFile, 3, refreshTime * 2, TimeUnit.SECONDS);

我的问题是,如果我将线程池计数从2更改为1或3,会有什么区别吗?我尝试过,但几乎一无所获。有人能解释线程池计数的真正用途吗?也许我的任务是轻量级的?

也就是说,corePoolSize是池中的线程数。可用线程选择符合条件的任务并在同一线程中运行。如果没有可用线程,尽管任务是可供运行的,但不会执行,因为所有线程都很忙。在您的情况下,您的任务可能很短。若要演示,请创建corepool size one并提交long正在运行任务,然后提交一个轻任务检查行为,然后将corepoolsize增加到2,并查看行为。

即corepoolsize是池中的数字线程。可用线程选择符合条件的任务,并在同一线程中运行。如果没有可用线程,尽管任务为eligble for run,但不会执行,因为所有线程都很忙。在您的情况可能是您的任务很短。要演示创建corepool大小1并提交长时间运行的任务,然后提交轻任务,请检查行为,然后将corepool大小增加到2并查看行为。

您需要了解,最终创建多少线程并不重要,线程将根据可用内核的数量执行。现在,根据,它是池中要保留的线程数,即使它们是空闲的

你能告诉我线程池计数的真正用途吗

上述代码行将在线程池中创建2个线程,但这并不意味着所有线程都将进行一些工作。但是,在同一时间,同一个线程可以用来执行提交的线程池中的其他任务


因此,在选择要创建的线程总数之前,最好先了解您的需求。我通常更喜欢这个数字,这取决于可用内核的数量,你需要了解,不管你要创建多少线程,最终,线程都会根据可用内核的数量执行。现在,根据,它是池中要保留的线程数,即使它们是空闲的

你能告诉我线程池计数的真正用途吗

上述代码行将在线程池中创建2个线程,但这并不意味着所有线程都将进行一些工作。但是,在同一时间,同一个线程可以用来执行提交的线程池中的其他任务


因此,在选择要创建的线程总数之前,最好先了解您的需求。我通常更喜欢这个数字,这取决于可用内核的数量。它取决于运行应用程序的机器的CPU内核的数量。若你们有更多的CPU核,多个线程可以并行运行,若你们的应用程序不是IO绑定的应用程序,整个系统的性能可以得到改善

CPU受限的应用程序将受益于更多的内核和线程

如果您有4个核心CPU,则可以将该值配置为4。如果您的机器只有一个CPU内核,那么将池大小更改为4将没有任何好处

相关SE问题:


它取决于运行应用程序的机器的CPU核数。若你们有更多的CPU核,多个线程可以并行运行,若你们的应用程序不是IO绑定的应用程序,整个系统的性能可以得到改善

CPU受限的应用程序将受益于更多的内核和线程

如果您有4个核心CPU,则可以将该值配置为4。如果您的机器只有一个CPU内核,那么将池大小更改为4将没有任何好处

相关SE问题:


想必您的任务确实是轻量级的。该参数生成新线程-如果您有一个每秒运行一次并需要900毫秒运行的任务,那么该线程将有100毫秒的空闲时间。若您有另一个每秒运行一次的任务,并且需要900毫秒才能运行,那个么您的线程池将无法处理。这里没有经验法则-如果计划的任务在所需的公差范围内运行,则不需要更多线程。@BoristheSpider我明白了。谢谢所以这是一个小尝试&看。是的。基准,基准,基准。然后再测试一些…@Boristespider ok benchmark lover。。谢谢。请把你的回答移到回答部分,这样我就可以选择作为答案。大概你的任务确实很轻。该参数生成新线程-如果您有一个每秒运行一次并需要900毫秒运行的任务,那么该线程将有100毫秒的空闲时间。若您有另一个每秒运行一次的任务,并且需要900毫秒才能运行,那个么您的线程池将无法处理。这里没有经验法则-如果计划的任务在要求的公差范围内运行,则不需要更多线程。@Boristespider i se
E谢谢所以这是一个小尝试&看。是的。基准,基准,基准。然后再测试一些…@Boristespider ok benchmark lover。。谢谢。请将您的回复移动到回答部分,以便我可以选择作为答案。只有当任务是CPU而不是IO绑定时,可用内核数才相关。如果计划的任务将审核日志写入文件或其他文件,那么CPU就有更多的线程。@Boristeider当然有了。如果您想提出任何建议,请提前说明。只有在任务是CPU而不是IO绑定的情况下,可用内核数才相关。如果计划的任务将审核日志写入文件或其他文件,那么CPU就有更多的线程。@Boristeider当然有了。如果您想提出任何声明,请继续
executor = Executors.newScheduledThreadPool(2);