实际上有一个技巧,如何在特定的fork-join池中执行并行操作。如果你将它作为一个任务在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 IntStream.range(1, 1_000_000).parallel() .filter(PrimesPrint::isPrime) .boxed().collect(Collectors.toList()) ).get(); System.out.println(primes);} catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e);} finally { if (forkJoinPool != null) { forkJoinPool.shutdown(); }}该技巧基于ForkJoinTask.fork,它指定:“安排在当前任务正在运行的池中异步执行此任务,如果适用,或者如果不包含inForkJoinPool(),则使用ForkJoinPool.commonPool()”。



