Java 8 并行流中的可自定义线程池
控制并行流中的线程资源分配可增强应用程序性能和模块化。然而,目前尚不清楚如何为 Java 8 中的特定流操作指定自定义线程池。
本文探讨了该问题并提供了解决方案,克服了并行流中共享线程池的限制。
问题陈述
考虑使用并行流的服务器应用程序。为了防止一个模块中的缓慢任务影响其他模块,需要对线程池进行划分。然而,标准并行流实现对所有操作都使用共享线程池。
如以下代码片段所示,受损任务会无限期延迟其他线程:
// CPU-intensive tasks in separate threads leveraging parallel streams ExecutorService es = Executors.newCachedThreadPool(); es.execute(() -> runTask(1000)); // Incorrect task es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.execute(() -> runTask(0));
解决方案
要在指定的 fork-join 池中执行并行操作,请将其用作内的任务游泳池。这将操作与共享池隔离:
final int parallelism = 4; ForkJoinPool forkJoinPool = null; try { forkJoinPool = new ForkJoinPool(parallelism); final List<Integer> primes = forkJoinPool.submit(() -> { // Parallel task here, for example: return IntStream.range(1, 1_000_000).parallel() .filter(PrimesPrint::isPrime) .boxed() .collect(Collectors.toList()); }).get(); System.out.println(primes); } catch (Exception e) { throw new RuntimeException(e); } finally { if (forkJoinPool != null) { forkJoinPool.shutdown(); } }
此技术利用 ForkJoinTask.fork() 的行为:“在当前任务正在运行的池中异步执行此任务(如果适用),或者使用如果不在 ForkJoinPool() 中,则为 ForkJoinPool.commonPool()。"
以上是如何将自定义线程池与 Java 8 并行流结合使用?的详细内容。更多信息请关注PHP中文网其他相关文章!