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

时间:2016-12-09 09:57:10

标签: java asynchronous concurrency

我想异步调用一个与主线程分开的函数。我是Java并发的新手,所以我问这样做的最佳方法是什么:

for(File myFile : files){
    MyFileService.resize(myfile)  <--- this should be async
}

while循环继续,而函数MyFileService.resize在后​​台工作,我的每个文件都在集合中。

我听说Java8的CompletionStage可能是很好的方法。 什么是最好的方式?

3 个答案:

答案 0 :(得分:10)

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
  3. 您也可以将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();
}