鉴于此代码:
public class TwoThreads {
static Thread laurel, hardy;
public static void main(String[] args) {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
hardy.sleep(1000);
} catch (Exception e) {
System.out.println("B");
}
System.out.println("C");
}
};
hardy = new Thread() {
public void run() {
System.out.println("D");
try {
laurel.wait();
} catch (Exception e) {
System.out.println("E");
}
System.out.println("F");
}
};
laurel.start();
hardy.start();
}
}
输出包括:
A C D E and F
我很困惑为什么包含F,因为在IllegalMonitorStateException
代码之外调用wait()时会抛出synchronized
。为什么达到F的印刷声明?我相信线程堆栈随后会爆炸,但程序应该将控制传递给它的主堆栈。
这是对的吗?
答案 0 :(得分:6)
您正在捕获打印“E”的块中的异常,从而有效地吞咽它。然后代码将继续打印“F”。由于这个原因,简单地捕获异常并且不执行任何其他操作的块是危险的。
答案 1 :(得分:3)
你捕获异常,所以控制进入catch块,然后在try / catch之后继续执行代码。
答案 2 :(得分:0)
在上面的代码中,只要在打印“D”后它们是非应用程序致命错误,就会在处理所有可捕获错误时始终打印“F”。
如果没有线程挂起,则此行为将保持一致。
向“F”添加一个布尔检查,如果抛出错误,该布料将被禁止,这将为您提供所需的行为。
答案 3 :(得分:0)
作为旁注,你在对象上调用Thread的静态sleep
方法,这会做出你预期的其他事情。因此,您不应该在实例上调用静态类方法。
(至于F印刷的原因,其他人都是正确的)
答案 4 :(得分:0)
我想知道你是怎么知道IllegalMonitorStateException
被抛出的。您正在使用任何Exception
而不使用e.printStackTrace();
。