是什么导致了这个Java未捕获错误

是什么导致了这个Java未捕获错误,java,multithreading,exception,error-handling,throwable,Java,Multithreading,Exception,Error Handling,Throwable,我有一个多线程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不存在。因此,doSom

我有一个多线程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%的时间发生。既然导致线程终止的不是一个可丢弃的,那么可能会发生什么呢

第二个线程停止后,主线程继续愉快地运行

这是我正在使用的代码,创建并运行第二个线程

Runnable secondThread = new Runnable() { ... }
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
threadPoolExecutor.execute(secondThread);


编辑:
doSomething
是对外部网站的
REST
API的调用。

您的问题的唯一答案是,在第一次打印输出和第二次打印输出之间,另一个线程正在向System.out打印

要解决此问题,您应该使用锁

static Object lock = ...; //everyone who's printing to System.out should synchronize on this before printing to System.out

synchronized (lock) {
  try{
     System.out.println(1); //prints
     doSomething();
     System.out.println(2); //doesn't print
  } catch(Throwable t) {
     System.out.println(3); //doesn't print
  }
}

听起来doSomething没有终止。因为您调用了一个外部服务,所以它可能会挂起。请执行以下操作: 呼叫 它位于java所在的同一目录中。 它提供了所有java进程的列表。
然后调用进程id

是否在第二个线程有机会运行之前终止Jvm?请向我们展示您用于等待第二个线程的代码。@p很好地锁定了主线程在第二个线程完成后继续运行数分钟。在
1
被记录之后,我看到许多来自主线程的日志消息
doSomething
只需约1秒。大概
doSomething
正在阻塞或以其他方式需要异常长的时间才能完成。如果此方法正常完成或抛出,则无法避免打印2或3。不,没有。不知道您是如何得出此结论的。在这种情况下,2或3将最终打印,只是可能以与预期不同的顺序打印。他说它们根本没有打印出来。@ControlAltDel问题不在于另一个线程在
1
2
内部打印,而是
2
3
从未打印出来,这是一件截然不同的事情。