gpt4 book ai didi

java - 在 Java 7+ ForkJoinPool 中,是否可以取消任务和所有子任务?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:53:15 27 4
gpt4 key购买 nike

我的程序通过分而治之的方法搜索问题的解决方案(任何解决方案),使用递归和 RecursiveTasks 实现:我为第一个分支分配了一个任务除法,然后递归到第二个分支:如果第二个分支找到了解决方案,那么我取消第一个分支,否则我等待它的结果。

这可能不是最优的。一种方法是让任何已启动的任务在找到解决方案时抛出异常。但是,我将如何取消所有已启动的任务?取消任务是否也会取消所有子任务?

最佳答案

您可以使用任务管理器的简单方法。例如:

public class TaskManager<T> {

private List<ForkJoinTask<T>> tasks;

public TaskManager() {
tasks = new ArrayList<>();
}

public void addTask(ForkJoinTask<T> task) {
tasks.add(task);
}

public void cancelAllExcludeTask(ForkJoinTask<Integer> cancelTask) {
for (ForkJoinTask<T> task : tasks) {
if (task != cancelTask) {
task.cancel(true);
}
}
}

public void cancelTask(ForkJoinTask<Integer> cancelTask) {
for (ForkJoinTask<T> task : tasks) {
if (task == cancelTask) {
task.cancel(true);
}
}
}

任务:

public class YourTask extends RecursiveTask<Integer> {

private TaskManager<Integer> taskManager;

@Override
protected Integer compute() {
// stuff and fork
newTask.fork();
// do not forget to save in managers list
taskManager.addTask(newTask);

// another logic

// if current task should be cancelled
taskManager.cancelTasks(this);

// or if you have decided to cancel all other tasks
taskManager.cancelAllExcludeTask(this);
}
}

关于java - 在 Java 7+ ForkJoinPool 中,是否可以取消任务和所有子任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23869028/

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