【发布时间】:2020-05-02 11:38:08
【问题描述】:
我有一个多线程 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 的调用。
【问题讨论】:
-
您是否在第二个线程有机会运行之前终止了 Jvm?
-
请向我们展示您用于等待第二个线程的代码。
-
@PiRocks 在第二个线程完成后,主线程会继续运行几分钟。在
1被记录后,我从主线程中看到了许多日志消息。doSomething只需要大约 1 秒。 -
可能
doSomething正在阻塞或以其他方式花费异常长时间才能完成。如果此方法正常完成或抛出异常,则无法避免打印 2 或 3。 -
不,没有。
标签: java multithreading exception error-handling throwable