2012-10-15 63 views
3

爲什麼我們在這個例子中看不到堆棧跟蹤?爲什麼ScheduledExecutorService不打印堆棧跟蹤?

public class NoStackTraceTester implements Runnable { 
    private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 

    private ScheduledFuture<?> lifeCheckFuture; 

    @Override 
    public void run() { 
     lifeCheckFuture = startLifecheck(); 
    } 

    private ScheduledFuture<?> startLifecheck() 
    { 
     Runnable lifeCheck = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       System.out.println("sending lifecheck ..."); 
       throw new RuntimeException("bang!"); 
      } 
     }; 
     return scheduler.scheduleAtFixedRate(lifeCheck, 1000, 1000, TimeUnit.MILLISECONDS); 
    } 

    public static void main(String[] args) { 
     new NoStackTraceTester().run(); 
    } 
} 

如果您嘗試評論該異常,則您將執行lifecheck函數的重複任務。 但是,如果有異常拋出,線程停止,但沒有詳細:(

你有一個想法,爲什麼?

+0

它只發生在計劃的執行器服務中嗎?您是否嘗試將任務提交給單線程執行程序? –

回答

1

如果你想要一個異常報告,則必須將自己的處理代碼。該ExecutorService中不會自動。發送異常跟蹤到標準輸出,而這是非常好的,它不會因爲這很少有我們所需要的生產代碼

基本上,這是方法:

public void run() 
{ 
    try { 
    System.out.println("sending lifecheck ..."); 
    throw new RuntimeException("bang!"); 
    } catch (Throwable t) { t.printStackTrace(); } 
} 
3

的ExecutorServic e將任何捕獲的Throwable放置在Future對象中。如果你檢查這個,你可以看到拋出了什麼異常。這並不總是可取的,因此您可能需要捕獲並處理或記錄run()方法中的任何異常。

注意:一旦異常逃脫,任務不會再重複。

Runnable lifeCheck = new Runnable() { 
    @Override 
    public void run() { 
     try { 
      System.out.println("sending lifecheck ..."); 
      throw new RuntimeException("bang!"); 
     } catch(Throwable t) { 
      // handle or log Throwable 
     } 
    } 
};