是什么导致了这个Java未捕获错误
我有一个多线程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
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
从未打印出来,这是一件截然不同的事情。