您可以awaitQuiescence
在游泳池上使用以提供帮助。但是,您无法选择要帮助的任务,它只会从池中获取下一个待处理的任务,因此,如果有更多待处理的任务,您可能最终会在执行这些任务之前执行这些任务。
ForkJoinPool forkJoinPool = new ForkJoinPool(1);
// make all threads busy:
forkJoinPool.submit(() -> LockSupport.parkNanos(Long.MAX_VALUE));
// submit our task (may contain your stream operation)
ForkJoinTask<Thread> task = forkJoinPool.submit(() -> Thread.currentThread());
// help out
while(!task.isDone()) // use zero timeout to execute one task only
forkJoinPool.awaitQuiescence(0, TimeUnit.NANOSECONDS);
System.out.println(Thread.currentThread()==task.get());
将打印true
。
然而
ForkJoinPool forkJoinPool = new ForkJoinPool(1);
// make all threads busy:
forkJoinPool.submit(() -> LockSupport.parkNanos(Long.MAX_VALUE));
// overload:
forkJoinPool.submit(() -> LockSupport.parkNanos(Long.MAX_VALUE));
// submit our task (may contain your stream operation)
ForkJoinTask<Thread> task = forkJoinPool.submit(() -> Thread.currentThread());
// help out
while(!task.isDone())
forkJoinPool.awaitQuiescence(0, TimeUnit.NANOSECONDS);
System.out.println(Thread.currentThread()==task.get());
当它尝试执行第二个阻塞任务时将永远挂起。
尽管如此,它将让启动线程帮助处理池的待处理任务,这将提高它自己的任务被执行的机会,只要没有无限的任务(上面的例子是极端的,只是为了演示而选择的)。
但请注意,Fork/Join 框架和Stream
API 之间的整个关系无论如何都是一个实现细节。