如果Java代码中的某个点发生Exception
,则控件转到catch
块。但是,如果此代码实际上位于多线程run()
方法中,那么当run()
出现时,如何指示代码完成Exception
方法?
换句话说,我如何指示线程run()
方法已完成,因为它知道发生了Exception
?
答案 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()
方法结束。