您的位置:首页 > 其它

计算一个包含50个整数的数组的和(初级多线程应用)------学习笔记

2019-08-13 17:43 78 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_43607635/article/details/99451357

1先定义一个整数数组,为了方便,代码如下:

int[] a = new int[50];
for (int i = 0; i < a.length; i++) {
a[i] = i;
}

2.设计需要几个线程来完成,每个线程完成的平均个数:

int num = 5;
int avg = a.length/num;

3.声明定义计算和的线程类:
要想计算和,要将数组传进来,以及要计算的部分的下标范围,为了输出总和在定义一个静态变量
代码如下:

class MyThread extends Thread{
private int[] a;  //要计算的数组
private int start;  //每个线程计算的起点
private int end;  //每个线程计算的终点
private int sum;  //每次的和
public  static int allsum;  //总和

public MyThread(int[] a, int start, int end) {
this.a = a;
this.start = start;
this.end = end;
}

public int getSum() {
return sum;
}

public void setSum(int sum) {
this.sum = sum;
}
@Override
public void run() {
for (int i = start; i < end; i++) {
sum +=a[i];
}
System.out.println(getName()+"---->"+sum);
allsum +=sum;
}

}

4.for循环创建线程,并启动:
错误示范:

for(int i=0;i<num;i++ ) {
MyThread thread = new MyThread(a,i*avg,(i+1)*avg);
thread.start();
try {
thread.join();  //变成串行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(MyThread.allsum);

在每次创建线程时调用join()方法-----------并行变串行 失去了多线程的意义
正确示范:

MyThread[] mt = new MyThread[num];
for(int i = 0 ; i < num ; i++) {
mt[i] = new MyThread(a,i*avg,(i+1)*avg);
mt[i].start();
}
//没能运行结束的插入
for(int i = 0 ;i < num ; i++) {
try {
System.out.println("--->"+i);
mt[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(MyThread.allsum);

个人想法:前面开启了线程,进行并发运算,要想输出总和,必须保证每个线程都运行了,这里设置这个遍历join的目的就是保证每个线程都能完成,然后打印:结果如下:
线程相关的运行结果一般都不固定:

Thread-0---->45
Thread-3---->345
Thread-2---->245
Thread-1---->145
--->0
--->1
--->2
Thread-4---->445
--->3
--->4
1225

可以看到如果线程已经运行完毕,即已经死亡,join()方法就没有用了,在进入遍历join()循环之前完成的,并行完成,之后的变成了主线程等待子线程完成。
再附几次运行结果:

Thread-1---->145
--->0
Thread-0---->45
Thread-2---->245
--->1
Thread-3---->345
--->2
--->3
--->4
Thread-4---->445
1225

上面这个就是因为插入是主线程,只有主线程会等待,子线程仍然会并发。
具体描述:Thread-1,在主线程遍历join之前就完成了
在主线程等待Thread-0线程完成的时候,Thread-2也刚好随后完成了运行,
而Thread-3则是在遍历到第一个的时候正好完成。
Thread-4则是被主线程等待完成

Thread-0---->45
Thread-2---->245
--->0
--->1
Thread-3---->345
Thread-1---->145
Thread-4---->445
--->2
--->3
--->4
1225

上面这个就是在主线程遍历join()之前,并发完成了一部分,在遍历过程中又陆续完成了一部分

如有错误,劳烦大佬们指正。。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐