博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程组
阅读量:6689 次
发布时间:2019-06-25

本文共 2352 字,大约阅读时间需要 7 分钟。

hot3.png

问题的提出,我们经常会有几项的任务,这几项任务之间本身没有先后顺序关系,或者是协作来共同完成一个目标。这个时候,我们就希望能够把这几项任务并行进行运行以充分利用CPU,缩短运行时间,或者把大的任务分成小的任务,所有的小任务都完成时,再继续进行下一阶段的处理。
这个时候就有一个问题了,因为一般的Java多线程都是互不相关的,也就是当这个任务在执行的时候,主线程也会执行,但是因为这个时候前面的任务还不一定执行完毕,所以,主线程继续向下执行是有问题的,因此我们就要主线程等待这些线程执行完毕后再向下执行。
为此,封装了一个线程组的概念,一个线程组内可以包含N个线程,所有的线程运行完毕后,线程组才会结束,调用线程组的线程才会继续向下执行。
首先看示例:
public class NumberAdd extends AbstractProcessor {	public static int sumValue;	private static Object lockObject = new Object();	public NumberAdd(String name) {		super(name);	}	@Override	protected void action() throws Exception {		for (int i = 0; i < 1000; i++) {			add();			Thread.sleep(1);		}	}	private static void add() {		synchronized (lockObject) {			sumValue++;		}	}}
上面的程序是一个类,它用于把sumValue中的值增加1000。
下面是测试用例
public void testStart() {		MultiThreadProcessor processors = new MultiThreadProcessor("number add");		for (int i = 0; i < 10; i++) {			processors.addProcessor(new NumberAdd("add" + i));		}		long startTime = System.currentTimeMillis();		processors.start();		long endTime = System.currentTimeMillis();		logger.log(LogLevel.INFO, "执行时间:{}", endTime - startTime);		assertEquals(10000, NumberAdd.sumValue);	}
启动了10个线程来执行添加操作,因为每个线程添加1000,最终应该是添加30000才对。
最终的执行结果:
-0    [main] INFO   - 线程组
运行开始,线程数10...-5 [number add-add0] INFO - 线程
运行开始...-6 [number add-add4] INFO - 线程
运行开始...-6 [number add-add3] INFO - 线程
运行开始...-6 [number add-add1] INFO - 线程
运行开始...-6 [number add-add2] INFO - 线程
运行开始...-6 [number add-add7] INFO - 线程
运行开始...-7 [number add-add8] INFO - 线程
运行开始...-7 [number add-add5] INFO - 线程
运行开始...-7 [number add-add6] INFO - 线程
运行开始...-7 [number add-add9] INFO - 线程
运行开始...-1023 [number add-add6] INFO - 线程
运行结束-1023 [number add-add1] INFO - 线程
运行结束-1024 [number add-add9] INFO - 线程
运行结束-1024 [number add-add2] INFO - 线程
运行结束-1025 [number add-add5] INFO - 线程
运行结束-1029 [number add-add7] INFO - 线程
运行结束-1029 [number add-add4] INFO - 线程
运行结束-1030 [number add-add0] INFO - 线程
运行结束-1030 [number add-add3] INFO - 线程
运行结束-1031 [number add-add8] INFO - 线程
运行结束-1031 [main] INFO - 线程组
运行结束, 用时:1026ms-1032 [main] INFO -
并且测试用例也执行通过,说明最终的结果,确实是加了30000次。
而且是在线程组执行完毕后,才执行的assertEquals语句。
从此,写多线程协作就像写普通程序一样了。(注意是像,不是是,因为还是要注意冲突对象的同步问题的)

转载于:https://my.oschina.net/tinyframework/blog/170154

你可能感兴趣的文章
什么是语法糖?
查看>>
rabbitMQ的安装和创建用户
查看>>
每天一道LeetCode--169.Majority Elemen
查看>>
Struts2笔记——第一个实例HelloWorld
查看>>
Maven安装
查看>>
2.1列表相关知识点
查看>>
OpenStack images
查看>>
xsigo systems
查看>>
ofbiz ins
查看>>
iOS动画实现改变frme和contenOffset
查看>>
深度学习框架搭建之最新版Python及最新版numpy安装
查看>>
mysql GRANT ALL PRIVILEGES 限制某个或所有客户端都可以连接至mysql
查看>>
AaronYang风格 C语言挑讲[二][基本类型、运算符和表达式]
查看>>
DroidPilot使用第一步 - 安装
查看>>
vue-cli —— 项目打包及一些注意事项
查看>>
linux下对/sys/class/gpio中的gpio的控制 (转)
查看>>
ubuntu启动报错 Errors were found while checking the disk-drive for /
查看>>
Django的ModelForm
查看>>
Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案
查看>>
PHP学习之路(六)
查看>>