2014-01-13 199 views
1

我正在創建用戶線程並將它們放入size = 5的固定池中。我希望我的線程在5分鐘內執行。這些線程在遠程服務器上完成一些數據庫操作但由於網絡延遲,一些線程停止並等待來自遠程服務器的響應,並因此導致我不想要的延遲。所以我希望所有待處理的線程在5分鐘內完成,否則它們應該在特定的超時時間內被殺死或中斷。我怎樣才能做到這一點。在Executors.newFixedThreadPool中的單個線程上超時

我使用Jdk.1.6.0_45

 int i = 0; 
     ExecutorService executor = Executors.newFixedThreadPool(5); 
     while (i < 10) { 
      ThreadClass thread = new ThreadClass(); 
      thread.setCounter(i); 
      executor.execute(thread); 
      i++; 
     }   
     executor.shutdown(); 
     System.out.println("Wiating for threads to terminate"); 

     while (!executor.isTerminated()) {} 

     System.out.println("Finished all threads"); 
+0

名稱'ThreadClass'表明它是Thread的子類。這是真的,還是隻是一個Runnable的實現? – isnot2bad

+0

是的,它是Thread的子類。 –

+2

然後這是錯的。任務和線程之間不同。任務是一項必須完成的工作(通常是一個Runnable)。線程是並行運行代碼的機制。執行者已經在內部使用線程來執行任務。 ThreadClass應該是一個任務。重命名它並且不是從Thread派生而是實現Runnable! – isnot2bad

回答

1

試試這個方法:

executor.shutdown(); 
if (!executor.awaitTermination(5, TimeUnit.MINUTES)) { 
    executor.shutdownNow(); 
} 

如果你的線程上的一些功能測試對於中斷阻止這隻會工作。否則,你不能做太多的事情:除了中斷之外,沒有辦法可靠地停止線程。