我用Java编写了一个数独求解器作为家庭作业,我目前正试图找出它可以面对的问题输入以使其更好.我用David Bau的数独生成器生成了几千个数独网格,现在我正在运行我的程序来对付它们.
问题在于,虽然大多数都是在非常合理的时间内完成的,但其中一些证明是有问题的,并使我的算法搜索变得疯狂,直到我用尽堆空间.所以我认为我应该将解决工作转移到辅助线程并以超时运行它.现在,我正在使用一个线程(以一种形式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);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,显然,人们不会简单地Future
在Java中取消.Future<T>.cancel(boolean)
显然不会马上打断任务.正因为如此,游戏池一直处于执行不间断任务的状态,随后的尝试会暂停,因为它们永远不会有机会运行.
向池中添加更多线程不是一种选择,因为我在有限的核心上运行,如果太多的任务顽固地运行,那么合法的线程将被不公平地放慢速度.我也不希望频繁检查任务是否从我的主算法中止.
我怎么能突然,无情地和残忍地终止任务?我愿意接受让我在主线程上恢复的任何东西.
编辑我的算法是完全顺序的,不使用全局对象,并且不包含锁.据我所知,如果任务随机取消,任何事情都不会出错; 即使它确实如此,也不是生产代码.我准备好走这条危险而危险的行走.
正如在任何其他语言中一样,仁慈地终止线程的方法是弃用或不推荐.因为这样的方法可能会导致死锁(终止的线程不会释放它所持有的锁).
解决问题的正确方法是Thread.currentThread ().isInterrupted ()
在Callable中对主循环的每次迭代进行额外检查.因此,当线程被中断时,它会看到它并优雅地关闭.
因为你是在另一个线程中运行的代码,所以你应该不难修改它.
归档时间: |
|
查看次数: |
310 次 |
最近记录: |