繁体   English   中英

简单的Java并行程序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM