2012-12-12 29 views
4

我正在使用Java實現一個多線程程序,其中每個thread的類型爲class Node extends Thread如何在Java線程上使用共享內存?

所有這些類都會生成某些值,這些值將被其他類使用。

對於main很容易得到從產生threads的值,但是從threads本身,我怎麼能得到其他threads值是多少?

//Start the threads from a list of objects 
for (int i = 0; i < lnode.size(); i++) { 
    lnode.get(i).start(); 
} 

感謝

+0

在一個單一的過程中共享所有線程默認情況下所有的內存,並且可以在任何時間訪問任何這種內存。 – millimoose

+3

請停止擴展Thread而不是實現Runnable這種可怕的做法。 – Perception

回答

1

這聽起來像你正在尋找一個ConcurrentHashMap但沒有更詳細一點,很難說。

你希望在這些線程之間分享什麼樣的數據,他們將如何分享它?

順便說一句 - 通常認爲執行Runnable比擴展Thread更好。

3

如果是同一過程/ JVC實例的線程,你將不需要「共享內存」,你只需要爲您的數據的胎面內通過構造函數或靜態參考基準,例如。 但是,如果多個線程在該數據上寫入數據,則需要一個同步/控制訪問機制。

2

如果你做這樣的事情:

class MyThreadRunnable implements Runnable { 
    List<String> strings; 

    MyThreadRunnable(List<String> strings) { 
     this.strings = strings; 
    } 

    public void run() { 
     strings.add(getName()); 
    } 
} 

// ... 

List<String> sharedStrings = new ArrayList<String>(); 
Thread t1 = new Thread(new MyThreadRunnable(sharedStrings)); 
Thread t2 = new Thread(new MyThreadRunnable(sharedStrings)); 

t1.start(); 
t2.start(); 

那麼這兩個t1t2(兩種不同的類型相同的線程)將使用相同的列表,並看到改變它與其他的線。

實際上,由於我沒有使用任何簡單的同步,所以也可能會以某種不可預知的方式破壞列表並導致奇怪的錯誤。我強烈建議您研究進程同步,並在使用併發時使用java.util.concurrent包。

0

您可以使用ThreadLocal共享變量。 ThreadLocal的定義如下所示:

線程本地可被視爲訪問範圍,如請求 範圍或會話範圍。這是一個線程範圍。您可以在 線程的任何對象本地和這個對象將是全球和當地的具體 線程這是訪問該對象。

你可以找到更多的信息here