2011-08-28 54 views
9

我目前正在考慮如何設計一個Java多線程系統,需要做一些繁重的網絡處理和數據庫存儲。該計劃首先將啓動三個基本線程。沿着這些基本線程,我想啓動其他線程,而不是來自主程序,而是來自兩個線程。是否有可能爲一個線程啓動另一個線程導致某種像一個層次:Java中線程中的線程?

> Parent ->t0 thread1 -> t1 tread1.1 
>  ->t0 thread2 
>  ->t0 thread3 -> t2 thread3.1 

t0= inital time 
t1,t2 = time at a point in the running thread 
t1 != t2 

如果不是有人可以提供參考文獻的理論解決方案?

+1

呃,是的。你爲什麼不能?也許如果你嘗試過... –

+0

我不知道你在問什麼。你可以從任何java代碼創建一個新的線程,不管它運行什麼線程。線程是否需要保持對它們產生的其他線程的引用?您描述的層次結構的目的是什麼? – Russell

回答

8

是的,您可以根據需要啓動儘可能多的線程,但這可能不是最好的方法。使用非阻塞API會更好,因此您可以開始執行某個外部調用,並且調用線程可以立即開始執行其他操作,而無需等待套接字/數據庫調用返回。然後,當套接字/數據庫調用返回時,會觸發回調來完成該處理。

非阻塞I/O可以提供更高的CPU利用率,因爲您只需觸發調用並註冊回調函數,而不必嘗試平衡「正確」數量的併發線程,而這些併發線程大多隻是在睡覺。

http://www.owlmountain.com/tutorials/NonBlockingIo.htm

http://www.tensegrity.hellblazer.com/2008/03/non-blocking-jdbc-non-blocking-servlet-apis-and-other-high-mysteries.html

+0

你碰巧知道如何讓我的線程繼續運行,無論是否有例外。異常似乎停止線程(即我導致)。我試圖通過在線程內創建一個線程來解決它,但線程B中的異常(從線程A內部創建)會停止這兩個線程。兩者的布爾標誌在停止後保持爲真。 – Lealo

2

是一個線程可以啓動另一個線程,該線程可以啓動線程(S)和和...

在一個線程的run()方法 - 你可以創建並啓動其他線程。

3

要回答這個問題,是線程可以啓動其他線程。

層次是否重要?

您可能最好使用帶有緩存線程池的ExecutorService。這樣你可以集合線程而不是創建很多(這很昂貴)。 ExecutorServices還提供了其他很酷的功能,使用Callables/Runnables可能比使用自己的線程更容易測試。

0

有可能 爲爲例,你可以創造線程,並把ID在陣列這樣

UnThread[] tab= new UnThread[10] ; 

for (int i=0;i<20;i++) 

tab[i] = new UnThread(); 

後,你可以給subMainThread陣列選項卡

爲例

while(tab[1].isAlive()) { 
    //do somthing.. 
    System.out.println("Ligne affichée par le main"); 
    try { 
    // et faire une pause 
    tab[1].sleep(800); 
    } 
    catch (InterruptedException ex) {} 
} 

這裏簡單使用線程: http://kamel.berrayah.com/wordpress/2013/07/java-threads/