代码之家  ›  专栏  ›  技术社区  ›  JacksonCounty

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

  •  0
  • JacksonCounty  · 技术社区  · 4 年前

    我有一个多线程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);
    
    

    编辑: 做点什么 是对a的呼叫 REST 外部网站的API。

    0 回复  |  直到 4 年前
        1
  •  2
  •   Thomas Krieger    4 年前

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

        2
  •  -1
  •   ControlAltDel    4 年前

    你的问题的唯一答案是,在你的第一次打印和第二次打印之间,另一个线程正在打印到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
      }
    }