java - 不使用主线程的 Fork 和 Join

标签 java multithreading concurrency

我想使用线程池来处理项目列表,然后等待它们完成。如果它们没有全部完成,我还需要能够在处理 4 分钟后超时。

这是我现在的状态

ForkJoinPool threadPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);

list.forEach(entry -> threadPool.execute(() -> {
    // processing
}));

if (!threadPool.awaitQuiescence(4, TimeUnit.MINUTES)) {
    // send alert about delay
}

问题是,有时这种方法会使用主线程来处理列表项之一,这意味着 awaitQuiescence 直到该列表项完成后才会开始。是否有任何其他线程池允许类似的东西但保证不使用主线程,或者有没有办法将 ForkJoinPool 配置为不使用?

最佳答案

我认为问题在于您仍然在主线程中迭代 (list.forEach)。使用并行流并将整个计算委托(delegate)给您的池:

ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);

pool.execute(() -> {
    list.parallelStream().forEach(item -> {
        // processing
    });
});

if (!pool.awaitQuiescence(4L, TimeUnit.MINUTES)) {
    // send alert about delay
}

我推荐阅读 this question (和给定的答案)以查看如何使用 ForkJoinPool 和并行流。

关于java - 不使用主线程的 Fork 和 Join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38515794/

相关文章:

java - 为 Java 应用程序运行数据库迁移

java - 单击按钮后更新 GUI : JavaFX

java - 如何创建 spring/spring-boot 库?

java - 更改主类中的 Spring boot 日志文件

Android Surfaceview 线程和内存泄漏

python - 在 Python 函数中的线程之间传递变量变化 [初学者]

2 个线程的 Java 扫描器

scala - 带有 var 的不可变映射或带有 val 的可变映射?

java - 当线程池大小小于执行的任务数时,使用 newFixedThreadPool 的多线程程序不会正常运行

java - 使用 jaxb 生成大型 xml