使用ExecutorService创建的最大线程数是否有任何限制

时间:2017-09-04 09:48:04

标签: multithreading threadpool executorservice

我正在创建一个需要多个进程并行运行的应用程序。要运行的进程数是动态的,这取决于收到的输入。

例如,如果用户想要关于三种不同的东西[汽车,自行车,汽车]的信息,那么我需要三个独立的线程来并行运行。

numberOfThreadsNeeded = getNumberOfThingsFromInput();

ExecutorService executor = Executors.newFixedThreadPool(numberOfThreadsNeeded);

代码段:

public class ConsoleController {

private static final Log LOG = LogFactory.getLog(ConsoleController.class);

@Autowired
ConsoleCache consoleCache;

Metrics metrics;

public List<Feature> getConsoleData(List<String> featureIds, Map<String, Object> input, Metrics metrics) {
    this.metrics = metrics;
    List<FeatureModel> featureModels =
            featureIds
                    .stream()
                    .map(consoleCache::getFeature)
                    .collect(toList());

    Integer numberOfThreadsNeeded = getThreadCount(featureModels);
    ExecutorService executor = Executors.newFixedThreadPool(numberOfThreadsNeeded);

    featureModels.stream()
            .map(f -> (Callable<Result>) () -> f.fetchData(input, metrics))
                    .map(executor::submit)
                    .collect(toList()));

要创建的线程数从1到100不等。在初始化期间定义thread pool大小是否安全? 而且我想知道在threads中运行100 parallel是否安全?

1 个答案:

答案 0 :(得分:0)

根据Java没有硬限制,但可能存在限制,例如,在JVM实现或操作系统中。所以,实际上说有一个限制。有一点,添加更多线程会使性能变差,而不是更好。此外,内存可能会耗尽。

使用ExecutorService的方式与预期的方式不同。通常,您将创建一个ExecutorService,其中包含最适合您环境的线程限制数。

请记住,即使您确实希望并行执行所有任务,但考虑到硬件/软件并发限制,您将无法实现它。

顺便说一句,如果您仍然希望为每个请求创建一个ExecutorService - 请不要忘记调用其shutdown()方法,否则JVM将无法正常退出,因为仍会有线程停留。