2012-05-29 80 views
1

我正在修改一些遺留代碼以使用Spring的ThreadPoolTaskExecutor。這個應用程序有一個父代理進程,它異步觸發線程,然後使用getState()調用監視它們的狀態。現在ThreadPoolTaskExecutor的​​方法正在用於觸發子線程,即使在子線程的run()方法完成之後,getState()也總是返回「NEW」。如何使用ThreadPoolTask​​Executor獲取線程狀態?

另一種方法是在提供狀態信息的子線程對象內手動維護一個屬性,但是我想知道在使用ThreadPoolTaskExecutor時是否有已知的獲取線程狀態的方法。

+0

的主要原因是外部監測的目的。我們有一個顯示線程數量和狀態的網頁。 – opike

+0

真棒問題。我也需要這個!謝謝! –

回答

1

您可能是短暫的延伸Thread到​​時,你應該通過實現Runnable一類的類。如果是這種情況,那麼你的Thread類將從未被啓動,並將始終顯示爲狀態NEW這是有道理的。

execute() method需要Runnable類。您的代碼工作的唯一原因是Thread也實現了可運行。 ThreadPoolTaskExecutor類在內部管理自己的線程。然後,您的Thread類永遠不會作爲線程啓動,只會調用其run()方法。

2

改爲使用Runnable使用Callable,而不是使用execute使用submit。

Sample usage for Callable 

    private class TaskCallable implements Callable<SomeResponse> { 
     private final SomeRequest request; 

     public TaskCallable (final SomeRequest request) { 
      this.request = request; 
     } 

     public SomeResponse call() throws Exception { 
      SomeResponse response = someService.getData(request); 
      return response; 
     } 
    } 

    TaskCallable callable = new TaskCallable(request); 
    Future<SomeResponse> future = pooledExecutor.submit(callable); 

您可以檢查的Future.isDone()

相關問題