【问题标题】:completableFuture task should execute independently with main method taskcompletableFuture 任务应与主方法任务独立执行
【发布时间】:2018-09-28 08:35:31
【问题描述】:

如果我为每个 completableFuture 任务调用 future.get(),那么只有我的功能可以同时写入多个文件。 但是如果我删除 future.get() 代码,那么编写多个文件就不能正常工作。为此我应该添加 future.get() 代码。

仅供参考,我正在从 main 方法调用下面的方法,但这里发生的是,直到通过调用方法完成所有任务,我的 main 方法线程也等待完成并停止执行 main 方法的其他代码。 但我的目的是它应该在主线程中调用其他代码,并且调用方法应该异步工作。它不应该影响我的主要方法代码。 所以你能帮我按照我的要求实施吗?

下面是相同的代码:-

  private static void createCompletableFuture(ByteArrayOutputStream baOS, int totalBytes, 
            List<FileUploadMultiLocator> fileUploadList) {
        ExecutorService threadPool = Executors.newFixedThreadPool(4);
        for (FileUploadMultiLocator fileUploadMultiLocator : fileUploadList) {
            CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() ->{
                System.out.println(Thread.currentThread().getName() + " secondary task is called");
                fileUploadMultiLocator.baOS.write(baOS.toByteArray(), 0, totalBytes);
                fileUploadMultiLocator.setTotalBytes(totalBytes);
                threadPool.execute(fileUploadMultiLocator);
                 return 20;
            },threadPool);
            try {
                 future.get();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        threadPool.shutdown();
        try {
            threadPool.awaitTermination(1, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         return;
    }

【问题讨论】:

  • 创建一个List&lt;CompletableFuture&lt;Integer&gt;&gt;,然后在创建所有上传后调用CompletableFuture.allOf。现在,当您准备好等待所有任务完成时,您可以在 CompletableFuture 上调用 get。目前,当您等待每个任务时,您的代码是同步的!您需要启动所有任务,然后等待它们全部完成。
  • 主线程被阻塞,因为你调用了awaitTermination()。只需调用 shutdown() 并从方法返回(并删除显式的 return)。
  • @Kayaman 我试图删除 awaitTermination() 并返回语句。由于 awaitTermination(),主线程没有被阻塞。还有其他原因。
  • 好吧,future.get() 也有块,但我认为你理解并删除了它?
  • @Kayaman 是的,我也尝试过删除 future.get(),但正如我在删除 future.get() 后已经说过的那样,它在写入字节时无法正常工作。无需写入文件即可完成任务。

标签: java io stream completable-future


【解决方案1】:

您在 createCompletableFuture 方法中进行了异步调用,但我猜您是从主线程调用此方法,这就是您的主线程等待 createCompletableFuture 返回的原因。使用另一个线程从 main 方法调用此方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2020-07-15
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多