2011-12-20 93 views
1

我正在一個項目中,其中一個線程分叉了4個其他線程並等待它們完成。分叉螺紋應該能夠隨時停止分叉螺紋。 要,完成同樣的,我做了一件這樣:從線程開始新線程

class ForkedThread implements Runnable { 
    public boolean keepRunning = true; 
    public void run() { 
     while(keepRunning is true){ 
     //Do the Job 
     } 
    } 
} 

現在既然keepRunnig是公開的,它可以從外部訪問,可以爲假。 我的問題是我將不得不同步使用keeprunning或罰款。其次,這種技術是否可行。或者我應該使用ThreadPool來完成我的工作。 其實,使用ThreadPool會增加我不想要的代碼的複雜度。請幫忙。

回答

2

簡單地聲明keepRunning揮發性,即

public volatile boolean keepRunning = true; 

,你會沒事的。 volatile告訴Java該變量將被多個線程訪問並且應該是線程安全的。這對於布爾運算符來說並不是一個大問題,但是對於引用和longs來說這個問題變得很重要。

你正在使用的技術是一種很好的做法。它允許有問題的線程優美地終止。我建議你看看Java的新併發庫(即ExecutorService),因爲它們讓事情變得更容易和更安全。值得投資!

+1

這非常符合布爾值的問題!否則,JVM可以自由地讀取'keepRunning'一次,看到它是真的,將它存儲在本地緩存中(例如在CPU上),並從此處繼續讀取它。如果另一個線程修改它,則JVM沒有義務更新其緩存;你可以永遠旋轉。 'volatile'可以防止這種情況發生。這不僅僅是學術;我可以在我的雙核筆記本電腦上輕鬆製作它。 – yshavit

+0

+1 yshavit ...謝謝,所以我們都學習... –

0

你應該看看ExecutorService。它會做到這一點。