2015-11-04 52 views
1

我有2個代碼片段,一個使用ScheduledExecutorService在特定時間執行一個線程,另一個使用Timer在特定時間執行TimerTask。問題是使用ScheduledExecutorService時,即使線程的run()達到最後,監視器程序仍然指示它仍然存在(參見下圖)。另一方面,TimerTask在執行完成後結束其線程。ScheduledExecutorService不會像Timer一樣結束線程

我已將ScheduledExecutorService的Thread更改爲TimerTask,但收到相同的結果。如何在使用ScheduledExecutorService時解決問題?

計時器:

TimerTask task = new TimerTask() 
    { 
     @Override 
     public void run() 
     { 
      System.out.println("doing something"); 
     } 
    }; 

    Timer t = new Timer(); 
    t.schedule(task, 250); 

Thread count while using Timer

ScheduledExecutorService的:

Thread task = new Thread() 
    { 
     @Override 
     public void run() 
     {    
      System.out.println("doing something"); 
     } 
    }; 

    ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 
    scheduler.schedule(task, 250, TimeUnit.MILLISECONDS); 

Thread count while using ScheduledExecutorService

+0

您不提交線程到執行程序服務,您提交runnables。 –

回答

2

在您的第二個片段中,您創建了Thread實例,但ScheduledExecutorService已將該實例用作Runnable,即。它只關心其run方法。它實際上並不是startThread

ScheduledExecutorService維護自己的Thread(s)執行任務。與​​,這是一個單一的非守護進程Thread。您需要shutdownScheduledExecutorService才能完成該Thread

javadoc of Timer狀態

後的最後一次現場參照Timer對象消失,所有 未完成的任務已完成執行,計時器的任務執行 線程終止優雅(併成爲受垃圾 集合) 。

執行完TimerTask後,它將完成其內部線程。

+0

我將'scheduler.shutdown()'添加到'run()'的末尾,並且它工作正常。然而,我使用Thread的原因是實現'thread.setUncaughtExceptionHandler(uncaughtExceptionHandler)',因爲'ScheduledExecutorService'使用它自己的線程,'setUncaughtExceptionHandler'因此沒有效果?無論如何,我可以訪問ScheduledExecutorService的Thread並設置它的'UncaughtExceptionHandler'? – user945711

+0

@ user945711那不行。一個'Thread'的'uncaughtExceptionHandler'實際上只被爲該'Thread'對象創建的線程使用。 –

+0

@ user945711'schedule'給你一個'Future'。你可以在那裏處理你的例外。 –

相關問題