gpt4 book ai didi

Java 并发数 : Coordinating multiple tasks and have cancellation

转载 作者:搜寻专家 更新时间:2023-10-31 20:27:41 24 4
gpt4 key购买 nike

我正在寻找协调多个多线程任务的良好解决方案。

基本上我有 2 个任务,我调用 AB,它们需要在与主线程不同的线程上执行。

但是 B 必须在 A 完成后启动。 AB 本身包含几个应该并行运行的部分,称为 A1, A2, ... B1, B2, ...

并且有一个来自外部的调用者,无论进度如何,他都需要重新启动整个作业。我怎样才能做到这一点?如果每个子任务 (A1, ...) 已经完成,那么我想创建某种 boolean 数组来保存信息,如果是这样则开始 B。如果已经取消,则检查每个方法中的每几行代码。但在我看来,这不是一个优雅的解决方案,并且有办法很好地协调这一点。

enter image description here

最佳答案

在 Java8 中,您可以使用 CompletableFutures。 execA 方法启动三个并行任务并返回一个包含所有这些任务的 CompletableFuture。 execB 等待这个复合任务完成,然后启动它自己的一组任务。最后,main 方法中的 get 等待 B 方法完成。

public class Futures {
String name;
int value;

public static void main(String[] args) {
try {
execB(execA()).get();
} catch(InterruptedException|ExecutionException e) {}
}
Futures(String name, int value) {
this.name = name;
this.value = value;
}

void runMethod() {
System.out.println("Entering " + name);
try {
Thread.sleep(value * 1000);
} catch(InterruptedException e) {}
System.out.println("Exiting " + name);
}
public static CompletableFuture<Void> execA() {
return(
CompletableFuture.<Void>allOf(
CompletableFuture.runAsync(() -> (new Futures("a1", 4)).runMethod()),
CompletableFuture.runAsync(() -> (new Futures("a2", 2)).runMethod()),
CompletableFuture.runAsync(() -> (new Futures("a3", 1)).runMethod()))
);
}
public static CompletableFuture<Void> execB(CompletableFuture<Void> prev) {
try {
prev.get();
} catch (InterruptedException|ExecutionException e) {}
return(
CompletableFuture.<Void>allOf(
CompletableFuture.runAsync(() -> (new Futures("b1", 2)).runMethod()),
CompletableFuture.runAsync(() -> (new Futures("b2", 3)).runMethod()),
CompletableFuture.runAsync(() -> (new Futures("b3", 1)).runMethod())));
}
}

关于Java 并发数 : Coordinating multiple tasks and have cancellation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28961415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com