如何找出并行执行上下文中我需要的 N 个线程?
How to figure out N threads I need in a parallel execution context?
我在再投递系统工作。该系统尝试执行一个动作,如果动作失败,它会尝试再次执行两次,间隔五分钟,所以我使用 ExecutorService
实现来执行第一次执行,并使用 ScheduledExecutorService
来调度其他的,取决于它的结果(失败)。
我应该考虑什么来确定我需要的线程数?此时我只使用单线程模型(通过newSingleThreadScheduledExecutor
方法创建)
您应该只需要一个线程,因为一次只有一个操作 运行。您可以使用 CachedThreadPool 而不必担心它。
在不了解有关您的系统负载、它正在使用的环境以及处理一条消息需要多长时间的详细信息的情况下,很难说出您需要多少线程。但是,您可以考虑以下基本原则:
- 有很多线程是不好的,因为你会在上下文切换上花费大量时间,饥饿和浪费系统资源的可能性更高。
- 每个线程为其堆栈消耗一些 space 内存。在
x64
上,每个线程通常 1MB
。
我可能会为发送和重新传送创建 2 个线程池(一个计划的,一个非计划的),并在高负载下测试它们,线程数从 2 到 10 不等,看看哪个数字最适合。
我在再投递系统工作。该系统尝试执行一个动作,如果动作失败,它会尝试再次执行两次,间隔五分钟,所以我使用 ExecutorService
实现来执行第一次执行,并使用 ScheduledExecutorService
来调度其他的,取决于它的结果(失败)。
我应该考虑什么来确定我需要的线程数?此时我只使用单线程模型(通过newSingleThreadScheduledExecutor
方法创建)
您应该只需要一个线程,因为一次只有一个操作 运行。您可以使用 CachedThreadPool 而不必担心它。
在不了解有关您的系统负载、它正在使用的环境以及处理一条消息需要多长时间的详细信息的情况下,很难说出您需要多少线程。但是,您可以考虑以下基本原则:
- 有很多线程是不好的,因为你会在上下文切换上花费大量时间,饥饿和浪费系统资源的可能性更高。
- 每个线程为其堆栈消耗一些 space 内存。在
x64
上,每个线程通常1MB
。
我可能会为发送和重新传送创建 2 个线程池(一个计划的,一个非计划的),并在高负载下测试它们,线程数从 2 到 10 不等,看看哪个数字最适合。