Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在线程中发生异常时立即停止线程_Java_Multithreading_Exception - Fatal编程技术网

Java 在线程中发生异常时立即停止线程

Java 在线程中发生异常时立即停止线程,java,multithreading,exception,Java,Multithreading,Exception,如果Java代码中的某个点发生异常,控件将转到catch块。但是,如果这段代码实际上在多线程运行方法中,那么当异常发生时,我如何指示代码使用run方法完成 换句话说,我如何指示线程run方法已经完成,因为它知道发生了异常 …发生此异常时,我如何指示代码使用run方法结束。例如,代码如何自动指示线程run方法已完成,因为它知道发生了异常 如果我理解正确,请让catch块中的代码返回或设置终止条件。这终止了线程 有两种情况: 如果使用外部try/catch,则不需要显式返回: public void

如果Java代码中的某个点发生异常,控件将转到catch块。但是,如果这段代码实际上在多线程运行方法中,那么当异常发生时,我如何指示代码使用run方法完成

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

…发生此异常时,我如何指示代码使用run方法结束。例如,代码如何自动指示线程run方法已完成,因为它知道发生了异常

如果我理解正确,请让catch块中的代码返回或设置终止条件。这终止了线程

有两种情况:

如果使用外部try/catch,则不需要显式返回:

public void run() {

    try {
        while (!someExitCondition) {
            doSomethingUseful();
        }
    }
    catch (Exception e) {
        doSomethingWithTheException(e);
        // Just falling through ends the thread, because
        // `run` returns
    }
}
如果使用内部try/catch,则可以使用显式返回,或者最好设置终止条件:

public void run() {

    while (!someExitCondition) {
        try {
            doSomethingUseful();
        }
        catch (Exception e) {
            doSomethingWithTheException(e);
            return; // Terminates the thread; alternately, set a termination condition
        }
    }
}
如果您在线程的run方法中,您可以简单地返回,这将终止线程,就像在任何其他方法中调用return结束方法处理一样

可能是这样的,在这里,您监视异常并在异常发生时调用return

public void run() {
    try {
        // your code goes here
    }
    catch (Exception e) {
        return;
    }
}
但是,如果线程有多个方法,最好的方法可能是让每个方法声明它可以抛出异常。例如,如果你的线程是这样的

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
    }
}
查看其他每个方法如何引发异常。因此,如果在该线程的任何方法中抛出异常,它将触发run方法的try-catch,并从线程中返回,从而终止它


当然,如果run方法中的try-catch包含了该方法的所有代码,则不需要实际返回,因为它在到达run方法末尾时是隐式的。

似乎遗漏了问题的某些部分……您需要提供更多关于希望发生什么的详细信息,实际上发生了什么,等等。当然,代码值千言万语。这个问题不能以目前的形式得到合理的回答。这个问题显然还没有完成。编辑仍然含糊不清,但我已经尝试过了。你在问题上投入的精力越多,你得到的回答的质量和数量都会越好。如果你的问题已经得到回答,或者不再有效,请“勾选”以选择最合适的答案,这样每个人都知道问题已经解决。谢谢。谢谢,但是我应该在DoSomethingWithException代码中写些什么呢?@AbhishekShivkumar:这只是处理异常的代码的占位符行。您应该如何处理异常完全取决于您的代码所做的事情以及它应该如何响应异常。您是否碰巧知道,即使我正在捕获某些异常,它们是否会迫使线程退出?