2016-12-09 60 views
1

我想異步調用一個獨立於主線程的函數。我在Java併發新的,所以我問什麼是這樣執行操作的最佳方式:在Java中執行簡單的異步任務的最佳方法?

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

while循環繼續,同時在後臺與我的每一個在集合文件功能MyFileService.resize作品。

我聽說Java8的CompletionStage可能是實現它的好方法。 什麼是最好的方法?

回答

3

如何FutureJava8,例如:

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

對於CompletableFuture.supplyAsync默認將使用ForkJoinPool common pool,默認的螺紋尺寸是:

  1. System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", size)Runtime.getRuntime().availableProcessors() - 1,你也可以通過修改本
  2. Djava.util.concurrent.ForkJoinPool.common.parallelism=size

也可以使用supplyAsync方法與自己的Executor,如:

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

「最簡單」的直接解決方案是即時創建一個「裸機」線程並讓它調用該方法。詳情請參閱here

當然,編程總是關於增加抽象層次;從這個意義上講,你可以看看使用ExecutorService。當你提到java8時,這個here將是一個很好的起點(它也顯示瞭如何在更多java8風格中使用普通線程)。

0

最簡單的將是(與Java 8):

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