爲了熟悉並行編程,我想製作一個簡單的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)。似乎只有第四個線程開始。
我在做什麼錯?
'INT ANS = IntStream.of(ARR)的.sum();' –
什麼你認爲'(i + 1)/ 4'會給你嗎?對於'i' = 1或2它是0,對於3和4它是1. – bcsb1001
感謝這真是一個愚蠢的錯誤。顯然你是對的,我不能在那部分使用整數!萬分感謝!它現在有效! – DevX10