我有一个多线程的Java程序。主线程在第二个线程中执行以下代码,随后第二个线程结束。
try{
System.out.println(1); //prints
doSomething();
System.out.println(2); //doesn't print
} catch(Throwable t) {
System.out.println(3); //doesn't print
}
我运行这段代码时,偶尔会在控制台看到数字
1
输出,而数字 2
或者 3
没有出现。因此,似乎 doSomething
方法抛出了某种错误导致线程停止。这种情况大约发生在 0.5% 的时间里。由于没有 Throwable
导致线程终止,可能会发生什么问题呢?主线程在第二个线程停止后仍然可以正常继续运行。
以下是我用于创建和运行第二个线程的代码。
Runnable secondThread = new Runnable() { ... }
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
threadPoolExecutor.execute(secondThread);
编辑:
doSomething
是对外部网站REST
API的调用。
doSomething
只需要大约1秒钟的时间。 - JacksonCountydoSomething
正在阻塞或者需要异常长的时间才能完成。如果这个方法正常完成或者抛出异常,无法避免打印 2 或者 3。 - Michael