Java 8并行流中的自定义线程池

是否可以为Java 8指定自定义线程池http://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html“>平行流?我到处都找不到

假设我有一个服务器应用程序,我想使用并行流。但是这个应用程序很大,而且是多线程的,所以我想对它进行划分。我不希望在applicationblock任务的一个模块中运行缓慢的任务从另一个模块开始

如果我不能为不同的模块使用不同的线程池,这意味着我不能在大多数实际情况下安全地使用并行流

试试下面的例子。在不同的线程中执行一些CPU密集型任务。
这些任务利用并行流。第一个任务已中断,因此每个步骤需要1秒(通过线程睡眠模拟)。问题是其他线程会被卡住,并等待中断的任务完成。这是一个虚构的示例,但想象一下一个servlet应用程序和一个人向共享fork-join池提交一个长时间运行的任务

公共类并行测试{
公共静态void main(字符串[]args)引发InterruptedException{
ExecutorService es=Executors.newCachedThreadPool();
执行(()->runTask(1000));//任务不正确
执行(()->runTask(0));
执行(()->runTask(0));
执行(()->runTask(0));
执行(()->runTask(0));
执行(()->runTask(0));
es.shutdown();
等待终止(60,时间单位秒);
}
专用静态void runTask(int延迟){
范围(1,1_000_000).parallel().filter(ParallelTest::isPrime).peek(i->Utils.sleep(delay)).max()
.ifPresent(max->System.out.println(Thread.currentThread()+“”+max));
}
公共静态布尔iPrime(长n){
返回n>1&rangeClosed(2,(长)sqrt(n)).noneMatch(除数->n%除数==0);
}
}

实际上,有一个技巧可以在特定的fork-join池中执行并行操作。如果将其作为fork-join池中的任务执行,它将留在那里,而不使用公共池

最终整数并行度=4;
ForkJoinPool-ForkJoinPool=null;
试一试{
forkJoinPool=新的forkJoinPool(并行);
最终列表<整数>素数=forkJoinPool.submit(()->
//例如,这里的并行任务
IntStream.range(1,1_000_000).parallel()
.filter(PrimesPrint::iPrime)
.boxed().collect(收集器.toList())
).get();
系统输出打印项次(素数);
}捕获(中断异常|执行异常e){
抛出新的运行时异常(e);
}最后{
if(forkJoinPool!=null){
forkJoinPool.shutdown();
}
}

技巧基于ForkJoinTask.fork其中指定;安排在当前任务正在运行的池中异步执行此任务(如果适用),或者使用ForkJoinPool.commonPool()如果不是inForkJoinPool()

发表评论