是否可以为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()”