2016-03-19 58 views
0

爲了熟悉並行編程,我想製作一個簡單的java並行程序,它使用4個線程來計算數組中所有元素的總和。簡單的java並行程序

這裏是繼承Thread類SumClass:

public class SumThread extends Thread { 
int lo; 
int ho; 
int Arr[]; 
int ans=0; 

//constructor 
SumThread(int Arr[], int lo, int ho){ 
    this.Arr = Arr; 
    this.lo = lo; 
    this.ho = ho; 
} 

public void run(){ 
    for (int i=lo; i<ho; i++){ 
     ans += Arr[i]; 
    } 
    } 
} 

在這裏,我們有主類:

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    int Arr[] = { 1, 3, 4, 5, 5, 6, 7, 2, 7, 5, 2, 4 }; 
    int ans = 0; 

    SumThread[] sum = new SumThread[4]; 

    for (int i = 0; i < 4; i++) { 
     sum[i] = new SumThread(Arr, (i * Arr.length)/4, Arr.length * ((i + 1)/4)); 
     sum[i].start(); 

    } 

    for (int i = 0; i < 4; i++) { 
     try { 
      sum[i].join(); 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } 

    } 
    for (int i = 0; i < 4; i++) { 
     ans += sum[i].ans; 
    } 

    System.out.println(ans); 

    } 

} 

我使用的連接()函數來等待線程在訪問ans值並打印之前完成。 問題是我得到11結果,這是完全錯誤的。我注意到它只總計最後3個值(5,2,4)。似乎只有第四個線程開始。

我在做什麼錯?

+0

'INT ANS = IntStream.of(ARR)的.sum();' –

+0

什麼你認爲'(i + 1)/ 4'會給你嗎?對於'i' = 1或2它是0,對於3和4它是1. – bcsb1001

+0

感謝這真是一個愚蠢的錯誤。顯然你是對的,我不能在那部分使用整數!萬分感謝!它現在有效! – DevX10

回答

0

沒有線程安全是你如何傳遞數據。你可以使用一個ExecutorService,至少通過Future傳遞的返回值是線程安全的,但是我會使用其中一個內置的流API,它可以用2-3行代替所有這些代碼。

int[] array = { 1, 3, 4, 5, 5, 6, 7, 2, 7, 5, 2, 4 }; 
int sum = IntStream.of(array).parallel().sum(); 
System.out.println(sum); 

System.out.println(IntStream.of(1, 3, 4, 5, 5, 6, 7, 2, 7, 5, 2, 4).parallel().sum()); 
+0

實際上我並不需要程序,我知道有更好的方法來完成這種工作。但正如我在帖子中寫到的,我試圖熟悉並行編程,並找出程序中出現了什麼問題,以便我可以解決它。希望你明白。 – DevX10

+0

@Ergo在這種情況下,您需要確保結果正在主線程中讀取。我建議你將它們打印出來或者使用你的調試器來查看這些值是什麼。 –

0

這應該給你51

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    int Arr[] = { 1, 3, 4, 5, 5, 6, 7, 2, 7, 5, 2, 4 }; 
    int ans = 0; 

    SumThread[] sum = new SumThread[4]; 

    for (int i = 0; i < 4; i++) { 
     sum[i] = new SumThread(Arr, (i * Arr.length)/4, (Arr.length * (i + 1))/ 4); 
     sum[i].start(); 
    } 

    for (int i = 0; i < 4; i++) { 
     try { 
      sum[i].join(); 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
    } 
    for (int i = 0; i < 4; i++) { 
     ans += sum[i].ans; 
    } 

    System.out.println(ans); 
} 

}