Java completableFuture任务应与main method任务独立执行

Java completableFuture任务应与main method任务独立执行,java,io,stream,completable-future,Java,Io,Stream,Completable Future,如果我为每个completableFuture任务调用future.get(),那么只有我的功能可以同时编写多个文件。 但是,如果我删除future.get()代码,那么编写多个文件是不合适的。为此,我应该添加future.get()代码 仅供参考,我正在从main方法调用下面的方法,但这里发生的是,在调用方法完成所有任务之前,我的main方法线程也会等待完成并停止执行main方法的其他代码。 但我的目的是它应该调用主线程中的其他代码,并且调用方法应该异步工作。它不应该影响我的主方法代码。 所以

如果我为每个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;
    }
private static void createCompletableFuture(ByteArrayOutputStream,int totalBytes,
列表文件上传列表){
ExecutorService线程池=Executors.newFixedThreadPool(4);
用于(FileUploadMultiLocator FileUploadMultiLocator:fileUploadList){
CompletableFuture=CompletableFuture.SupplySync(()->{
System.out.println(Thread.currentThread().getName()+“调用辅助任务”);
fileUploadMultiLocator.baOS.write(baOS.toByteArray(),0,totalBytes);
fileUploadMultiLocator.setTotalBytes(totalBytes);
执行(fileUploadMultiLocator);
返回20;
},线程池);
试一试{
future.get();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(执行例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
threadPool.shutdown();
试一试{
线程池。等待终止(1,时间单位。分钟);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回;
}

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

创建一个
列表
然后在创建所有上载后调用。现在,当您准备等待所有任务完成时,可以在该
CompletableFuture
上调用
get
。当前,当您等待每个任务时,您的代码是同步的!您需要启动所有任务,然后等待它们全部完成。主线程被阻止,因为您调用了
waittermination()
。只需调用
shutdown()
并从该方法返回(并删除该显式
return
)。@Kayaman我已尝试删除waittermination()和return语句。主线程未因()而被阻止。还有其他原因。
future.get()
也会阻塞,但我以为你理解并删除了它?@Kayaman是的,我尝试过删除future.get(),但正如我在删除future.get()后所说的,它在写入字节时工作不正常。无需写入文件,即可完成任务。