【问题标题】:Stopping a Thread immediately whenever an Exception occurs within it每当其中发生异常时立即停止线程
【发布时间】:2012-05-10 12:47:05
【问题描述】:

如果 Exception 出现在 Java 代码中的某个位置,则控制转到 catch 块。但是,如果这段代码实际上是在一个多线程的run() 方法中,当Exception 发生时,如何指示代码以run() 方法结束?

换句话说,我怎么能告诉线程run()方法已经结束,因为它知道Exception已经发生了?

【问题讨论】:

  • 好像你错过了问题的某些部分......
  • 您需要提供更多关于您想要发生的事情、实际发生的事情等的详细信息。当然,代码值一千字。这个问题不能以目前的形式合理地回答。
  • 这个问题显然是未完成的。
  • 编辑仍然含糊不清,但我已经尝试过了。你在问题上付出的努力越多,你得到的答案的质量和数量就越好。
  • 如果您的问题已得到解答,或者不再有效,请“打勾”以选择最合适的答案,以便所有人都知道问题已解决。谢谢。

标签: java multithreading exception


【解决方案1】:

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

如果我的理解正确,请将代码放在 catchreturn 中或设置终止条件。这会终止线程。

有几种情况:

如果您使用外部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
        }
    }
}

【讨论】:

  • 谢谢,但是我在 doSomethingWithTheException 代码中应该写什么?
  • @AbhishekShivkumar:这只是处理异常的代码的占位符行。你应该对异常做什么完全取决于你的代码做什么以及它应该如何响应异常。
【解决方案2】:

如果你在你的Threadrun() 方法中,你可以简单地return,它终止Thread,就像在任何其他方法中调用return 结束方法处理一样。

可能是这样的,您可以在其中查看Exception,如果出现Exception,请致电return...

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。所以,如果在这个Thread的任何一个方法中抛出了Exception,就会触发run()方法的try-catch,而returnreturn出来,从而终止它。

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

【讨论】:

  • 您是否知道某些异常是否会强制线程退出,即使我正在捕获它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2015-12-04
  • 2020-10-05
  • 2019-12-06
相关资源
最近更新 更多