2011-07-05 24 views
-2

有沒有一種方法可以在線程中使用線程?如果是的話如何使用線程安全方式如何在線程中使用線程ThreadSafty

我試過這個線程內的線程,我得到錯誤的結果有時。請幫助我如何使用線程安全

for(int i=0; i<numExpression; i++) 
{ 
    final int _i = i; 
    final SDISQueryInfo _qryInfo = sdisQueryInfo; 
    final SDISQueryComponent _qryComponent = qryCompoents; 
    TCreate[i] = new Thread(new Runnable() 
    { 
     public void run() 
     { 
      _qryComponent.prepare(_qryInfo); 
     } 
    }); 
    TCreate[i].setName(_qryInfo.getQueryTerm(_i)); 
    TCreate[i].start(); 
} 
for(Thread t : TCreate) 
{ 
    t.join(); 
} 

在這裏,在這個_qryCompoents.prepare(_sdisQueryInfo)是我打電話功能要弄清楚內螺紋主題。這個函數裏面有線程。


對不起,這個問題我道歉..我無法移除此問題。

+1

@sehe聽起來像是一個SEO問題:)) – cnicutar

+0

線程內線程....成立? –

+0

我想你錯誤地理解了我所討論的......我提到的功能也包括線程。但它工作但不一致。所以我不知道爲什麼會發生這種情況.. –

回答

2

原則上,從其他線程開始線程沒有問題。線程之間沒有真正的區別(沒有父線程或子線程,可以這麼說)。

我不確定你是什麼意思通過「這個函數有一個線程在裏面......」。

我假設你的意思是它會啓動另一個線程。這絕不會產生很大的影響,除非內部線程與其他線程共享信息。您必須查閱文檔SDISQueryComponent.prepare以瞭解是否屬於這種情況。

我的期望是SDISQueryComponent可以與線程一起使用,原因很簡單,它很明顯是設計時考慮了線程(或者它不會啓動線程)。

我在這裏想到的最重要的事情是,您可能會遇到創建更多線程會造成爭用的問題(由於上下文切換開銷和可能的鎖定)使事情變得緩慢。

在這種情況下,通常的解決方案會涉及一個線程池和一個工作隊列。但是,我不知道SDISQueryComponent是否支持使用線程池,因此可能會出現在您的手中

+0

感謝您寶貴的時間.. –

+0

這裏我提到上面的代碼與線程工作正常..如果我添加線程內功能的結果有時它是正確的,並在一段時間它不顯示正確的結果(不一致)..讓我添加功能代碼也.. –

+0

http://download.oracle.com/javase/tutorial/essential/concurrency/pools.html,http://download.oracle的.com/JavaSE的/ 1,5.0 /文檔/ API/JAVA/util的/並行/ ThreadPoolExecutor.html – sehe