- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想为 parallelStream 使用自定义线程池。原因是我想在任务中使用 MDCContext。这是我为使用自定义线程池而编写的代码:
final ExecutorService mdcPool = MDCExecutors.newCachedThreadPool();
mdcPool.submit(() -> ruleset.getOperationList().parallelStream().forEach(operation -> {
log.info("Sample log line");
});
当 MDC 上下文没有被复制到任务时,我查看了日志。这些是我找到的日志。第一个日志在“(pool-16-thread-1)”中执行,但其他任务在“ForkJoinPool.commonPool-worker”中执行。第一个日志也有 MdcContextID。但是当我使用自定义线程池提交任务时,所有任务都应该在自定义线程池中执行。
16 Oct 2018 12:46:58,298 [INFO] 8fcfa6ee-d141-11e8-b84a-7da6cd73aa0b (pool-16-thread-1) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,298 [INFO] (ForkJoinPool.commonPool-worker-11) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,298 [INFO] (ForkJoinPool.commonPool-worker-4) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,298 [INFO] (ForkJoinPool.commonPool-worker-13) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,298 [INFO] (ForkJoinPool.commonPool-worker-9) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,299 [INFO] (ForkJoinPool.commonPool-worker-2) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,299 [INFO] (ForkJoinPool.commonPool-worker-15) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
这是应该发生的还是我遗漏了什么?
最佳答案
不支持在自定义线程池中运行并行流。当操作在不同的 Fork/Join 池的工作线程中启动时,它碰巧在不同的 Fork/Join 池中执行,但这似乎不是计划的功能,因为 Stream实现代码仍将在某些操作中在内部使用公共(public)池的工件。
在您的情况下,MDCExecutors.newCachedThreadPool()
返回的 ExecutorService
似乎不是 Fork/Join 池,因此它不会在全部。
有一个功能请求,JDK-8032512 ,关于更多的线程控制。它是开放的,据我所知,没有太多 Activity 。
关于java - CommonPool 而非自定义池中的 ParallelStream 队列任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52836178/
我的代码中有 parallelStreams(),它使用 ForkJoinPool . 线程池执行器有 4 个预定义的处理程序策略,我想知道公共(public)池中默认使用哪一个(如果有的话)。我在文
我已经确定,对于我的数据集,使用并行流确实比串行流更快。话虽如此,我想知道这个问题中讨论的 ForkJoinPool 使用情况:Custom thread pool in Java 8 paralle
我正在阅读线程并了解了 fork/join API。 我发现您可以使用 commonPool 作为管理线程的默认池来运行线程,或者我可以将线程提交到新创建的 ForkJoinPool。 据我了解,两者
我想为 parallelStream 使用自定义线程池。原因是我想在任务中使用 MDCContext。这是我为使用自定义线程池而编写的代码: final ExecutorService mdcPool
我使用ForkJoinPool.commonPool().execute(runnable)作为在应用程序的许多地方生成线程的便捷方法。但在特定调用时,调用线程中可运行对象中的代码需要更多时间(超过
CompletableFuture.runAsync 文档说明: Returns a new CompletableFuture that is asynchronously completed by
在我的代码中,我有一个包含静态最终变量的类 private static final ForkJoinPool pool = new ForkJoinPool(availableCPUs - 1);
这个问题在这里已经有了答案: scala.concurrent.forkjoin.ForkJoinPool vs java.util.concurrent.ForkJoinPool (1 个回答)
我是一名优秀的程序员,十分优秀!