我想异步调用一个与主线程分开的函数。我是Java并发的新手,所以我问这样做的最佳方法是什么:
for(File myFile : files){
MyFileService.resize(myfile) <--- this should be async
}
while循环继续,而函数MyFileService.resize
在后台工作,我的每个文件都在集合中。
我听说Java8的CompletionStage可能是很好的方法。 什么是最好的方式?
答案 0 :(得分:10)
Java8 中的Future怎么样,例如:
for(File myFile : files){
CompletableFuture.supplyAsync(() -> MyFileService.resize(myfile))
}
对于CompletableFuture.supplyAsync
默认将使用ForkJoinPool common pool,默认的线程大小为:Runtime.getRuntime().availableProcessors() - 1
,您也可以通过以下方式对其进行修改:
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", size)
Djava.util.concurrent.ForkJoinPool.common.parallelism=size
您也可以将supplyAsync
方法与您自己的Executor一起使用,例如:
ExecutorService executorService = Executors.newFixedThreadPool(20);
CompletableFuture.supplyAsync(() -> MyFileService.resize(myfile), executorService)
答案 1 :(得分:1)
“最简单”的直接解决方案是动态创建“裸机”线程并让它调用该方法。有关详细信息,请参阅here。
当然,编程总是关于增加抽象层次;从这个意义上讲,您可以考虑使用ExecutorService。当你提到java8时,这个here将是一个很好的起点(它还展示了如何以更多java8风格使用普通的Thread)。
答案 2 :(得分:1)
最简单的是(使用Java 8):
for(File myFile : files){
new Thread( () -> MyFileService.resize(myfile)).start();
}