每当发生异常时立即停止线程

时间:2012-05-10 12:47:06

标签: java multithreading exception

如果Java代码中的某个点发生Exception,则控件转到catch块。但是,如果此代码实际上位于多线程run()方法中,那么当run()出现时,如何指示代码完成Exception方法?

换句话说,我如何指示线程run()方法已完成,因为它知道发生了Exception

2 个答案:

答案 0 :(得分:4)

  

...当发生此异常时,如何用run()方法指示代码完成,.ie如何自动指示线程run()方法已完成,因为它知道发生了异常?

如果我理解正确,请在catch阻止return中设置代码或设置终止条件。这终止了线程。

有几种情况:

如果您使用外部try/catch,则不需要明确的return

public void run() {

    try {
        while (!someExitCondition) {
            doSomethingUseful();
        }
    }
    catch (Exception e) {
        doSomethingWithTheException(e);
        // Just falling through ends the thread, because
        // `run` returns
    }
}

如果您使用内部try/catch,则可以使用明确的return或(可能更好)设置终止条件:

public void run() {

    while (!someExitCondition) {
        try {
            doSomethingUseful();
        }
        catch (Exception e) {
            doSomethingWithTheException(e);
            return; // Terminates the thread; alternately, set a termination condition
        }
    }
}

答案 1 :(得分:1)

如果您使用的是run() Thread方法,则只需return,就像调用Thread一样终止return在任何其他方法中结束方法处理。

也许是这样的,你在那里看Exception并在return出现时致电Exception ......

public void run() {
    try {
        // your code goes here
    }
    catch (Exception e) {
        return;
    }
}

但是,如果您的Thread有多种方法,最好的方法可能是让每个方法声明它可以抛出Exception。例如,如果您的Thread是这样的......

public MyThread extends Thread {

    public void run() {
        try {
            runLongTask1();
            runLongTask2();
        }
        catch (Exception e) {
            return;
        }
    }

    public void runLongTask1() throws Exception {
        // your code here
    }

    public void runLongTask2() throws Exception {
        // your code here
    }
}

了解每个其他方法如何抛出Exception。因此,如果在此Exception的任何方法中引用了Thread,则会触发try-catch方法的run()return Thread,因此终止它。

当然,如果try-catch方法中的run()涵盖了该方法的所有代码,则不需要实际return,因为它在到达时是隐式的无论如何,run()方法结束。