2014-02-12 76 views
0

我有一個線程池有5個線程,並有他們未來的句柄存儲在一個ArrayList。我想要做的是在所有線程退出後返回主線程。我的情況是創建一個無限運行的程序。我的概念很簡單,但我不知道如何實現它。線程池關閉後返回主線程?

  1. main()方法調用threadManager()方法
  2. threadManager()創建線程
  3. 有些線程拋出一個異常和問題futureCancel()方法,所有線程發出future.cancel,然後關閉線程池
  4. 程序返回到主方法,該方法再次調用threadManager()並繼續。
+0

您可以重命名'futureCancel'(類似於'restartThreads'),並在其末尾調用'threadManager'嗎? (如果錯誤處理線程不是一個運行它的好地方,你可能會啓動一個新線程來運行'threadManager'。)在我聽起來像是在一天結束的時候,你想關閉所有的東西這個錯誤,並開始備份。 'main'不是特別的;你可以在任何線程的任何方法中做到這一點。一個注意:我會確保一些關閉應用程序的乾淨方式存在。 – jpmc26

+0

你明白了我的觀點,在一個錯誤結束時,我將關閉一切並重新啓動它。我想我可以讓futureCancel(restarThread)成爲舊池關閉的新線程,關閉老池並重新啓動一個新池。 –

+0

我有一個關機掛鉤,用於任何災難性事件,在不正確關機之前清理所有網絡連接。 –

回答

0

這是你想要做的嗎?

// Always has 5 threads even if 1 throws an exception 
ExecutorService exe = Executors.newFixedThreadPool(5); 

List<T> results = new ArrayList<T>(); 
while(results.isEmpty()) { 
    List<Callable<T>> tasks = createTasks(); 
    List<Future<T>> futures = exe.invokeAll(tasks); 

    for(Future<T> future : futures) { 
     try{ 
      results.add(future.get()); // throws InterruptedException, ExecutionException 
     } catch(Exception e) { 
      results.clear(); 
      break; 
     } 
    } 
} 
+0

類似的東西。但我不保存結果。所以我正在使用一個外部庫,它可以幫助檢測我的線程創建的連接的超時時間。一旦我在一個連接上遇到超時,我就去發佈「future.cancel」。有沒有辦法可以在該方法之後返回到主線程?添加一個while(true)循環是一個選項,但是我想要其他的東西在動作或類似的東西上保持阻塞狀態。 –

+0

我不明白你的「返回」主線程的概念。主線程永遠不會停止運行。線程不會「走到」和「從彼此回來」。他們被創造,他們運行,有時他們停止。他們不會互相「拜訪」。 – Stewart