2014-02-17 65 views
0

有3個線程:主線程(main()運行的線程),Thread AThread B有一個線程啓動另一個線程,然後死

操作順序:

  • 程序啓動(主())
  • 主線程中實例化並開始Thread A
  • Thread A X秒後實例化Thread B
  • Thread B已啓動。
  • Thread B X秒後實例化Thread A
  • Thread A開始。

如果調用Thread B是可運行的Thread A執行的最後一條語句,將Thread AThread B終止後,被實例化並開始了嗎?或者將Thread B嵌套在Thread A中,因此創建無限數量的嵌套線程?什麼是默認行爲,我將如何完成NOT創建無限數量的線程(我希望每個以前的線程在孩子生存時結束)。

A Thread.join()會導致線程等待,直到子線程死亡,是否正確?

如果這一般只是不好的做法,任何人都可以推薦替代品,基本上可以完成同樣的任務嗎?我需要一個函數,幾秒鐘後,調用另一個函數,然後與第一個函數同時運行。第一個函數在完成一些命令後會死掉。第二個函數應該在幾秒鐘後調用第一個函數的新實例。此循環應繼續,直到主線程中止(或直到​​程序退出)。

+1

如果你不想保持instanciating和銷燬一堆線程,你可以隨時查看工作線程池。這個想法是,線程呆在周圍,給他們工作單位,然後等待更多的工作。好處是你不會浪費時間在不斷的殺死和產生線程的開銷上。 – zero298

回答

2

你的問題包含答案:你正在考慮線程作爲任務或「運行的功能」,他們不是。線程執行任務,因此圍繞可創建其他任務的任務的想法設計代碼。任務只是實現Runnable接口的對象,僅此而已。您可以使用所需的所有數據構建這些任務(或可運行對象),甚至包括對其他(父級)任務的引用。
創建一個CachedThreadPool並且每當任務準備好執行時,使用execute方法轉儲線程池中的任務。

您需要考慮的一件事是程序關閉:您需要關閉ThreadPool才能正常關閉程序。您可以簡單地致電shutdownNow,但您可能需要設置一項技術,使重要任務有機會完成然後關閉。這需要一些練習才能正確(例如shutdownHooks並不容易),但從此以後,只要您需要多個線程,就可以重新使用它。

相關問題