我有一个实现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
,这有什么区别吗?我尝试过,几乎一无所获。谁能解释线程池计数的真正用途?也许我的任务是轻量级的?
您需要了解,要创建多少线程并不重要,最终,线程将在可用内核数上执行。现在,根据文档,它是"要保留在池中的线程数,即使它们处于空闲状态"。
你能告诉我线程池计数的真正用途是什么吗
executor = Executors.newScheduledThreadPool(2);
上面的代码行将在线程池中创建2
线程,但这并不意味着所有人都会做一些工作。但是,同时,同一线程可用于从提交的线程池中执行其他任务。
因此,在选择要创建的线程总数之前,最好先了解您的要求。(我通常更喜欢这个数字,具体取决于可用内核的数量(
corePoolSize 是 pool 中的数字线程。可用线程选取符合条件的任务并在同一线程中运行。如果没有可用的线程,尽管任务符合运行条件,则不会执行,因为所有线程都繁忙。在你的情况下,你的任务可能是非常短暂的。要演示,请创建核心池大小 1 并提交长时间运行的任务,然后提交轻任务,请检查行为,然后将核心池大小增加到 2 并查看行为。
这取决于运行应用程序的机器的 CPU 内核数。如果有更多的 CPU 内核,则可以并行运行多个线程,并且如果您的应用程序不是 IO 绑定应用程序,则可以提高整个系统的性能。
CPU绑定的应用程序将受益于更多数量的内核和线程。
如果您有 4 核 CPU,则可以将该值配置为 4。如果计算机具有单个 CPU 核心,则将池大小更改为 4 没有任何好处。
相关 SE 问题:
Java:如何根据 CPU 内核扩展线程?
多线程比单线程快吗?