【问题标题】:Best way to execute simple async task in Java?在 Java 中执行简单异步任务的最佳方法?
【发布时间】:2017-04-24 18:27:28
【问题描述】:

我想异步调用一个与主线程分开做某事的函数。我是 Java 并发的新手,所以我问什么是执行此类操作的最佳方式:

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

while 循环继续进行,而函数 MyFileService.resize 在后台与我收集的每个文件一起工作。

我听说 Java8 的 CompletionStage 可能是实现此目的的好方法。 最好的方法是什么?

【问题讨论】:

    标签: java asynchronous concurrency


    【解决方案1】:

    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

    您也可以将supplyAsync 方法与您自己的Executor 一起使用,例如:

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

    【讨论】:

      【解决方案2】:

      “最简单”的直接解决方案是动态创建一个“裸机”线程并让它调用该方法。详情请见here

      当然,编程总是要增加抽象层次;从这个意义上说,您可以考虑使用 ExecutorService。正如你提到的 java8,这个 here 将是一个很好的起点(它还展示了如何以更 java8 的风格使用普通线程)。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-10-23
          • 2015-07-14
          • 1970-01-01
          • 1970-01-01
          • 2015-12-06
          • 1970-01-01
          • 2021-01-15
          • 2012-05-20
          相关资源
          最近更新 更多