在Java中执行简单异步任务的最佳方法是什么?

9
我希望异步调用一个函数,使其在主线程之外执行某些操作。我对Java并发编程不太熟悉,因此想问一下,最佳的执行方式是什么?
for(File myFile : files){
    MyFileService.resize(myfile)  <--- this should be async
}

当函数MyFileService.resize在后台处理集合中的每个文件时,while循环会继续执行。

我听说Java8中的CompletionStage可能是一个很好的方式来完成此操作。什么是最佳方法?

3个回答

18

Java8 中的 Future 怎么样?以下是一个例子:

for(File myFile : files){
    CompletableFuture.supplyAsync(() -> MyFileService.resize(myfile))
}

CompletableFuture.supplyAsync的默认值会使用ForkJoinPool common pool,默认线程数为:Runtime.getRuntime().availableProcessors() - 1。您也可以通过以下方式修改:

  1. System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", size)
  2. Djava.util.concurrent.ForkJoinPool.common.parallelism=size

您也可以使用自己的Executor来使用supplyAsync方法,例如:

ExecutorService executorService = Executors.newFixedThreadPool(20);
CompletableFuture.supplyAsync(() -> MyFileService.resize(myfile), executorService)

2
“最简单”的直接解决方案是在程序运行时创建一个“裸机”线程,并让它调用那个方法。详情请见这里
当然,编程总是关于增加抽象层次; 在这个意义上,你可以研究使用ExecutorService。如果你提到了Java8,这里将是一个良好的起点(也展示了如何在更java8风格中使用普通线程)。

1

最简单的方法是(使用Java 8):

for(File myFile : files){
  new Thread( () -> MyFileService.resize(myfile)).start();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接