gpt4 book ai didi

java - 我如何残酷无情地中止 Java 中的任务?

转载 作者:搜寻专家 更新时间:2023-11-01 01:46:24 25 4
gpt4 key购买 nike

我在家庭作业中用 Java 编写了一个数独求解器,目前我正试图找出它可能面临的有问题的输入以使其变得更好。我用 David Bau's sudoku generator 生成了几千个数独网格,现在我正在针对它们运行我的程序。

问题是,虽然它们中的大多数在非常合理的时间内完成,但其中一些被证明是有问题的,并使我的算法疯狂搜索,直到我用完堆空间。所以我想我应该将解决工作离岸到辅助线程并在超时的情况下运行它。现在,我正在使用一个线程的线程“池”(以 ExecutorService 的形式)并且我正在提交 Callable到它了。然后我尝试通过超时获取值:

Callable<Long> solveAndReturnTime = new Callable<Long>() { /* snip */ };
Future<Long> time = executor.submit(solveAndReturnTime);
try
{
long result = time.get(10, TimeUnit.SECONDS);
System.out.printf("%d millis\n", result);
}
catch (TimeoutException e)
{
System.err.println("timed out");
time.cancel(true);
}

我的问题是,显然,不会简单地取消 Future在 Java 中。 Future<T>.cancel(boolean)显然不会立即中断任务。正因为如此,池被困在执行不死任务,随后的尝试超时,因为它们永远没有机会运行。

向池中添加更多线程不是一种选择,因为我在有限的内核上运行,如果顽固地运行太多任务,合法的任务将被不公平地减慢。我也不希望经常检查任务是否已从我的主要算法中止的开销。

我怎样才能突然、无情和残忍地终止任务?我愿意接受任何能让我在主线程上恢复的事情。

编辑 我的算法是完全顺序的,不使用全局对象,也不包含锁。据我所知,如果随机取消任务,不会有任何问题;即使有,也不是生产代码。我已准备好为此走上危险而危险的道路。

最佳答案

就像在任何其他语言中仁慈地终止线程的方法一样,已弃用或不推荐使用。因为这样的方法可能会导致死锁(被终止的线程不会释放它持有的锁)。

该问题的正确解决方案是在 Callable 的主循环的每次迭代中额外检查 Thread.currentThread ().isInterrupted ()。因此,当线程被中断时,它会发现并优雅地关闭。

而且由于您的代码在另一个线程中运行,因此您修改它应该不难。

关于java - 我如何残酷无情地中止 Java 中的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8982388/

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