gpt4 book ai didi

java - 如何停止长时间运行的函数

转载 作者:行者123 更新时间:2023-12-01 10:19:17 26 4
gpt4 key购买 nike

考虑这段代码:

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 接口(interface),这样我就可以停止线程。这将在我们的代码中引入许多更改,我不知道我们使用的框架是否允许创建线程。

最佳答案

如果不使用线程,这是不可能的。必须设置一些东西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 的解决方案不同,这会启动 InterruptedException从您的 thead 代码中的任何位置(您应该相应地处理异常!)允许您随时停止执行。

如果您想要更多控制,可以添加 try.. catch里面compute这样你就可以拥有finally子句来关闭任何打开的文件或诸如此类的内容。也许更好的是,有一个 try.. finally在计算中以“好的”方式处理关闭的事情,并且 try.. catch (InterruptedException)solve方法来处理中断情况下发生的情况(简而言之,清理逻辑和中断逻辑不必位于同一个方法中)。

关于java - 如何停止长时间运行的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35720544/

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