2016-03-19 11 views
0

パラレルプログラミングに精通するために、4つのスレッドを使用して配列のすべての要素の合計を計算する簡単なjavaパラレルプログラムを作成したかったのです。ここでシンプルな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)だけを合計することに気づいた。 4番目のスレッドだけが起動するようです。

私は間違っていますか?

+0

'int型ANS = IntStream.of(編曲).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); 
} 

}

関連する問題