Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正在等待所有线程完成_Java_Multithreading_Java 8_Completable Future_Futuretask - Fatal编程技术网

Java正在等待所有线程完成

Java正在等待所有线程完成,java,multithreading,java-8,completable-future,futuretask,Java,Multithreading,Java 8,Completable Future,Futuretask,编辑:我的问题不同,它与链接的问题无关 我使用完成处理程序编写了以下代码 FutureTask<Void> futureTask = new FutureTask<Void>(() -> { System.out.println("callback"); return null; }); Runnable task = () -> { for(int i=0; i<5; i++) { System.out.pri

编辑:我的问题不同,它与链接的问题无关

我使用完成处理程序编写了以下代码

FutureTask<Void> futureTask = new FutureTask<Void>(() -> {
    System.out.println("callback");
    return null;
});

Runnable task = () -> {
    for(int i=0; i<5; i++) {
        System.out.println(Thread.currentThread().getName() + " " + i);
    }
    futureTask.run();
};

new Thread(task).start();
new Thread(task).start();

保存到已创建线程的链接,并调用
join()


保存到已创建线程的链接,并调用
join()


根据需要的控制程度,可以使用ThreadPoolExecutor:

tpe.execute(可运行)

等待活动计数==0

然后关闭执行器

或者将线程保持在一个结构中


等待特定的TTL,然后在状态为可运行时中断它们,具体取决于您希望使用ThreadPoolExecutor的控制程度:

tpe.execute(可运行)

等待活动计数==0

然后关闭执行器

或者将线程保持在一个结构中


等待特定的TTL,然后在状态为RUNNABLE时中断它们。一种简单的方法是将RUNNABLE提交给ExecutorService,然后调用,然后调用:


无需使用CompletableFuture。

一种简单的方法是将您的可运行服务提交给ExecutorService,然后调用,然后调用:


无需使用CompletableFuture。

假设您的方法
result()
返回您要检索的值,即声明为
Type result()
,您可以使用

CompletableFuture<Type> f = CompletableFuture.allOf(
    CompletableFuture.runAsync(() -> method1()),
    CompletableFuture.runAsync(() -> method2())
).thenApply(_void -> result());
CompletableFuture.allOf(
    CompletableFuture.runAsync(() -> method1()),
    CompletableFuture.runAsync(() -> method2())
).thenRun(() -> result());

相反。

假设您的方法
result()
返回要检索的值,即声明为
Type result()
,则可以使用

CompletableFuture<Type> f = CompletableFuture.allOf(
    CompletableFuture.runAsync(() -> method1()),
    CompletableFuture.runAsync(() -> method2())
).thenApply(_void -> result());
CompletableFuture.allOf(
    CompletableFuture.runAsync(() -> method1()),
    CompletableFuture.runAsync(() -> method2())
).thenRun(() -> result());


相反。

它将在那里阻塞,我想调用这些线程并忘记它,方法返回,我希望在回调中进行后续操作。谢谢你教我加入though@user2727195最好使用另一个线程,然后运行连接和随后的回调OK,这是有道理的。在这里扩展知识,你知道CompletableFuture吗?它适用于我的问题吗?@user2727195但这里真的没有
Future
。。。您不是在寻找结果,只是希望在两个线程都完成后等待开始下一步。所以不,它不适用于这里。。。换句话说,“你没有未来的孩子!”嘻嘻嘻嘻嘻嘻。。。好的,我已经有了我的时刻,不用担心,但我对其他方法持开放态度,我的问题中没有与这段代码相关的东西,它将在那里阻塞,我想调用这些线程并忘记它,方法返回,我希望在回调中得到后续。谢谢你教我加入though@user2727195最好使用另一个线程,然后运行连接和随后的回调OK,这是有道理的。在这里扩展知识,你知道CompletableFuture吗?它适用于我的问题吗?@user2727195但这里真的没有
Future
。。。您不是在寻找结果,只是希望在两个线程都完成后等待开始下一步。所以不,它不适用于这里。。。换句话说,“你没有未来的孩子!”嘻嘻嘻嘻嘻嘻。。。好的,我已经有了我的时刻。我不担心,但是我对其他方法持开放态度,我在我的问题中不受这段代码的束缚。似乎isTerminated()可能是使用此函数等待的方法。我本来想在回答中加上这个,但我认为这会使事情变得过于复杂,这取决于人们想如何处理它们。我倾向于避免使用池,因为我宁愿保留在需要时拔掉插头的能力。如果您有
ThreadPoolExecutor
,只需使用
invokeAll
提交任务列表并等待其完成即可。不需要使用诸如活动计数或关机之类的乱码。如果你有一个列表,但如果你没有,比如动态构建可运行程序,这就是你要做的。没有乱七八糟的。但是,如果其中一个跑步者从未放弃控制权,你的想法就会被卡住。这就是为什么我很少使用游泳池。或者有一个具有活动countright的TTL。似乎isTerminated()可能是使用此函数等待的方法。我本来想在回答中加上这个,但我认为这会使事情变得过于复杂,这取决于人们想如何处理它们。我倾向于避免使用池,因为我宁愿保留在需要时拔掉插头的能力。如果您有
ThreadPoolExecutor
,只需使用
invokeAll
提交任务列表并等待其完成即可。不需要使用诸如活动计数或关机之类的乱码。如果你有一个列表,但如果你没有,比如动态构建可运行程序,这就是你要做的。没有乱七八糟的。但是,如果其中一个跑步者从未放弃控制权,你的想法就会被卡住。这就是为什么我很少使用游泳池。或者有一个带有活动计数的TTL为什么不能
futureTask.run()被替换为旧方法?基本上,您可以通过实现一个调用其前身的
Thread.join()
,然后执行任何您想要的操作来链接任务。可能重复的@Ravindrababu不是重复的。为什么不能
futureTask.run()被替换为旧方法?基本上,您可以通过在其前身上实现调用
Thread.join()
,然后执行任何您想要的操作来链接您的任务。可能重复的@Ravindrababu不是重复的。您能让它成为不同的调用者和响应者吗,Executiver将是一个不同的方法,而带有结果的回调将位于不同的方法中。请将其设置为不同的调用方和响应方,Executiver将是一个不同的方法,带有结果的回调将位于不同的方法中。
CompletableFuture.allOf(
    CompletableFuture.runAsync(() -> method1()),
    CompletableFuture.runAsync(() -> method2())
).thenRun(() -> result());