2017-04-07 86 views
0

我是新來的Java。我的老師給了我一個關於多線程的功課,其中有兩個線程Example和Example1。 示例對線程進行更改,並且Example1將其讀取。 但是,當我執行Example1線程無法正常工作。線程不共享相同的數據變量

例螺紋:

public class Example extends Thread { 
    public int[] array = {2,1,0,5,9}; 
    public void run(){ 
     for(int i=0; i<array.length;i++){ 
      array[i] = array[i]+i; 
      System.out.println(getName()+" : "+array[i]); 
     } 
    } 
} 

例1螺紋:

public class Example1 extends Example implements Runnable { 

    @Override 
    public void run(){ 
     for(int i=0;i<array.length;i++){ 
      System.out.println(getName()+" : "+array[i]); 
     } 
    } 
} 

主要:

public class TestExample { 

    public static void main(String[] args) { 
     Example t1 = new Example(); 
     t1.setName("t1"); 
     t1.start(); 

     Example1 obj = new Example1(); 
     Thread t2 = new Thread(obj); 
     t2.setName("t2"); 
     t2.start(); 
    } 

} 

並且輸出是:

t1 : 2 
t1 : 2 
t1 : 2 
t1 : 8 
t1 : 13 
Thread-1 : 2 
Thread-1 : 1 
Thread-1 : 0 
Thread-1 : 5 
Thread-1 : 9 

線程示例1無法讀取int []數組中已更改的值,即使Example已經對int []數組進行了更改。 可能是什麼問題以及如何糾正?

+2

您正在使用兩個單獨的實例。所以在任何地方都沒有共享變量。而且,這兩個類都很奇怪。首先,任何從'Thread'繼承的類都默認實現'Runnable'。由於'Example1'繼承自'Thread'繼承的'Example',因此根據定義,它也是'Runnable'。你確定這些是你老師給你的課嗎? – RealSkeptic

+0

當我從Example1線程中移除實現時,它仍然給我相同的結果,但仍然沒有讀取int []數組。 – IHS

+0

刪除實現不會改變這一點。有* no *共享變量。你有一個'''你用'new'創建的實例。你有'new'創建的'Example1'的另一個實例。每個實例都有自己的'array'副本。他們沒有共享相同的'陣列'。也許你應該向我們展示你從老師那裏得到的原始作業,一個字一個字。 – RealSkeptic

回答

0

只是使INT []數組靜態的。

public static int[] array = {2,1,0,5,9}; 

輸出:

t1 : 2 
t1 : 2 
t1 : 2 
t1 : 8 
t1 : 13 
t2 : 2 
t2 : 2 
t2 : 2 
t2 : 8 
t2 : 13 
0

我覺得這裏的問題是誤解實例化的概念。

你有一個數組的生活所以每次你實例化一個不同的陣列時間是指新對象的內部創建對象本身。

這是不同於如果事情被標記爲「靜態」,這將迫使它有一個實例。

所以有兩個選項,使用一個單獨的靜態項引用將所有實例

OR

通陣列周圍或含有您的螺紋對象之間的陣列的一些數據結構之間共享,所以你實際上操縱它,而不是當在創建線程對象

+0

明白了。謝謝。 – IHS

0

您可以使用靜態,但更好的辦法OO上創建兩個不同的陣列工作:作出這樣的實例字段,如:

public class Example extends Thread { 
    private int[] array; 
    public Example(int[] array) { 
    this.array = array; 
    } 
... 

類似地,對於示例2;然後你在你的主去:

int[] array = { 1, 2, 3, 4 }; 
Example ex1 = new Example(array); 

換句話說:你的兩個類在兩個不同的陣列對象工作。只需將相同的對象交給您的兩個主題!

而只是要確定:當您添加該代碼;你可能還會看到一些令人驚訝的結果 - 你有線程處理相同陣列;可能是並行的。所以要爲各種意想不到的輸出做好準備!