[英]Simple java parallel program
为了熟悉并行编程,我想制作一个简单的java并行程序,该程序使用4个线程来计算Array中所有元素的总和。
这是扩展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);
}
}
我使用join()函数等待线程完成,然后再访问ans值并进行打印。 关键是我得到11分,这是完全错误的。 我注意到它只求和最后3个值(5、2、4)。 似乎只有第四个线程被启动。
我究竟做错了什么?
没有数据传递的线程安全性。 您可以使用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());
这应该给您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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.