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