考虑以下代码:

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/

10-09 13:44