考虑以下代码:
class Solver {
private boolean abort = false;
public void solve(List<Case> cases) {
while(!abort) {
for(Case c : cases)
compute(c); // method that take too long to finish
}
}
// a bunch of methods
public void abort() {
abort = true;
}
}
// in another class
Solver solver = new Solver();
solver.solve(cases);
public void onSolveAborted() {
solver.abort();
}
如何更改此解决方案,以便立即中止解决功能。我知道我可以在Solver类中实现Runnable接口,因此可以停止线程。这将在我们的代码中引入许多更改,并且我不知道我们使用的框架是否允许创建线程。
最佳答案
如果不使用线程,这将是不可能的。必须先设置abort()
,然后运行线程才会停止。看一下这个例子:
class Solver implements Runnable {
private List<Case> cases;
public Solver(List<Case> cases) {
this.cases = cases;
}
private void compute(Case c) {
try {
// Do some computation here
} finally {
// Sound the horns! Abandon ship!
}
}
public void solve(List<Object> cases) {
for (Case c : cases) {
try {
compute(c); // method that take too long to finish
} catch (InterruptedException e) {
// Hmm, maybe I should take the hint...
break;
}
}
}
public void run() {
solve(cases);
}
public static void main(String args[]) {
List<Case> cases = new ArrayList<Case>();
// Populate cases
Thread t = new Thread(new Solver(cases));
t.run();
do {
// Wait 30 seconds
t.join(30 * 1000);
// Not done yet? Lets drop a hint..
if(t.isAlive()) {
t.interrupt();
}
} while (t.isAlive());
}
}
很简单,它在线程中启动求解。主线程最多等待30秒,然后中断
solve
方法。 solve
方法捕获中断并正常退出计算。与使用boolean abort
的解决方案不同,这可以从thead代码中的任何地方启动InterruptedException
(并且您应该相应地处理异常!)允许您随时暂停执行。如果需要更多控制,可以在
try.. catch
内添加compute
,以便可以使用finally
子句来关闭所有打开的文件。也许更好的是,在计算中使用try.. finally
以“精巧”的方式处理关闭的事情,在try.. catch (InterruptedException)
方法中使用solve
来处理在中断情况下发生的情况(总之,清理逻辑和中断逻辑不必使用相同的方法)。关于java - 如何停止长时间运行的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35720544/