-3

如果Exception在 Java 代码中的某个点出现,则控制转到该catch块。但是,如果此代码实际上是在多线程run()方法中,我如何指示代码在发生run()时完成该方法Exception

换句话说,我怎样才能指示线程该run()方法已经完成,因为它知道Exception已经发生了?

4

2 回答 2

4

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

如果我对您的理解正确,请将代码放在catch块中return或设置终止条件。这终止了线程。

有几种情况:

如果您使用的是 external try/catch,则不需要显式return

public void run() {

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

如果您使用的是 inner try/catch,则可以使用显式return或(可能更好)设置终止条件:

public void run() {

    while (!someExitCondition) {
        try {
            doSomethingUseful();
        }
        catch (Exception e) {
            doSomethingWithTheException(e);
            return; // Terminates the thread; alternately, set a termination condition
        }
    }
}
于 2012-05-10T12:52:26.210 回答
1

如果你在你的run()方法中Thread,你可以简单地return,它以与在任何其他方法Thread中调用return结束方法处理相同的方式终止。

也许像这样,如果发生这种情况,您会在其中观察Exception并打电话......returnException

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在 this 的任何方法中抛出an Thread,它将触发该try-catch方法的run(),并return退出Thread,从而终止它。

当然,如果try-catch你的run()方法中的 覆盖了方法的所有代码,你实际上不需要,因为无论如何return它到达方法的末尾时它是隐式的。run()

于 2012-05-10T13:06:48.883 回答