计算一个包含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()之前,并发完成了一部分,在遍历过程中又陆续完成了一部分
如有错误,劳烦大佬们指正。。。。
相关文章推荐
- 黑马程序员之C#编程基础学习笔记:计算一个整数数组的所有元素的和。
- 黑马程序员之C#编程基础学习笔记:有一个整数数组,请声明一个字符串数组,将整数数组中的每一个元素的值转换为字符串保存到字符串数组中
- 定义一个数组,放入50个随机生成的的整数,整数范围为1—10的闭区间,计算1—10这10个整数在数组中分别出现的次数
- 黑马程序员之C#编程基础学习笔记:将一个整数数组的每一个元素进行如下的处理:如果元素是正数则将这个位置的元素的值加1,如果元素是负数则将这个位置的元素减1。
- SilverLight学习笔记--实际应用(一)(7):手把手建立一个Silverlight应用程序之数据回滚
- SilverLight学习笔记--实际应用(一)手把手建立一个Silverlight应用程序
- 一个Qt多线程应用的新手笔记
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 习题2.8 随机数组的三种生成算法(补) 将bash的实现翻译成比较纯正的bash风格
- 黑马程序员之C#编程基础学习笔记:将一个字符串数组的元素的顺序进行反转。
- 编写一个函数,从标准输入读取一列整数, 把这些值存储在一个动态分配的数组中并返回这个数组。 函数通过观察EOF判断输入列表是否结束。 数组的第一个数是数组包含的值的个数, 它的后面就是这些整数值。
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- SilverLight学习笔记--实际应用(一)(6):手把手建立一个Silverlight应用程序之创建数据校验类3
- 黑马程序员之C#编程基础学习笔记:提示用户输入两个整数(假设i1,i2)。如果i1,i2都是正数,则将i2的值递增一个数,然后打印i1+i2的值;如果i1,i2都是负数,则将i1的值递减10个数,然后
- [C++学习笔记] 链表应用1判断一个集和是否为另一个集合的子集
- CLR学习笔记--Attribute应用的一个小示例
- 给定一个整数,把整数中包含的每一个数字放到一个数组中(不要把数字转化为字符串处理)
- 黑马程序员----C 语言学习笔记之二维数组的存储和应用(迷宫小游戏)
- 《利用python进行数据分析》NumPy基础:数组和矢量计算 学习笔记
- 3、定义一个结构体变量(包含年月日),计算该日在本年中为第几天?要求写一个days函数。参数是此结构体类型的变量,返回值是整数。
- SilverLight学习笔记--实际应用(二) 建立一个轮盘图片展示程序