收藏 分享(赏)

Java分布式应用学习笔记05多线程下的并发同步器.doc

上传人:yjrm16270 文档编号:8514207 上传时间:2019-06-30 格式:DOC 页数:12 大小:86.50KB
下载 相关 举报
Java分布式应用学习笔记05多线程下的并发同步器.doc_第1页
第1页 / 共12页
Java分布式应用学习笔记05多线程下的并发同步器.doc_第2页
第2页 / 共12页
Java分布式应用学习笔记05多线程下的并发同步器.doc_第3页
第3页 / 共12页
Java分布式应用学习笔记05多线程下的并发同步器.doc_第4页
第4页 / 共12页
Java分布式应用学习笔记05多线程下的并发同步器.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、 1 / 12Java分布式应用学习笔记 05多线程下的并发同步器刘岩Email:Blog: 1. 前言JDK提供的并发包,除了上一篇提到的用于集合外,还有线程的调度、协作、调度等等功能。上篇提到过,线程之间除了竞争关系,还有协作关系。在高并发环境下有效利用Java并发包解决线程之间协作的特殊场景。在并行计算,尤其是多线程计算的结果集合并的时候都需要用到这些并发同步器。还有一种使用场景,就是跨越多台机器(实机)的多线程进行并行运算,需要将多台机器进行结果集的汇总,合并。其原理核心也是使用这些并发协作包。2. FutureTaskFutureTask是进行并行结果集合并的类,此类是 Future

2、接口的实现。在主线程中启动多个线程进行并发计算,之后再根据各个线程的执行结果进行汇总,归并,得出一个总的结果,这个多线程可以是在一台机器上,充分利用多核 CPU硬件,在科研单位可能分布式集群环境一起并发计算一个大任务,每个机器相当于一个线程,执行完毕后将反馈的结果返回来进行合并后才是最终的结果。而主线程可以等待分线程的结果,也可以不等待,全凭具体业务需要而定,不过一般情况下还是要等一等分线程的结果才能往下执行的。如果不等分线程,也可以在主线程中不再理会分线程即可。举个实例,比如这时候东方不败要想练成葵花宝典 ,那么需要前提条件是 2个,第一手中得有葵花宝典秘籍,第二就是挥刀自宫。恩,挥刀自宫这

3、个主线程东方不败可以自己完成,夺取葵花宝典可以派别人兄弟童柏雄去干,2 条线并行实施,等另一个人取得葵花宝典了,这边主线程也挥刀自宫了,行了,能练了!咱先看代码行吧package threadConcurrent.test;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/* 分线程汇总* author liuyan*/public class FutureTaskDemo SuppressWarn

4、ings(“unchecked“)public static void main(String args) / 初始化一个Callable对象和FutureTask 对象2 / 12Callable otherPerson = new OtherPerson();/ 由此任务去执行FutureTask futureTask = new FutureTask(otherPerson);/ 使用futureTask创建一个线程Thread newhread = new Thread(futureTask);System.out.println(“newhread线程现在开始启动,启动时间为:“ +

5、 System.nanoTime()+ “ 纳秒“);newhread.start();System.out.println(“主线程 东方不败,开始执行其他任务“);System.out.println(“东方不败开始准备小刀,消毒 .“);/兄弟线程在后台的计算线程是否完成,如果未完成则等待/阻塞while (!futureTask.isDone() try Thread.sleep(500);System.out.println(“东方不败:“等兄弟回来了,我就和小弟弟告别 颤抖”“); catch (InterruptedException e) e.printStackTrace()

6、;System.out.println(“newhread线程执行完毕,此时时间为“ + System.nanoTime();String result = null;try result = (String) futureTask.get(); catch (InterruptedException e) e.printStackTrace(); catch (ExecutionException e) e.printStackTrace();if(“OtherPerson:经过一番厮杀取得葵花宝典“ .equals(result)3 / 12System.out.println(“兄弟,干

7、得好,我挥刀自宫了啊! “);elseSystem.out.println(“还好我没自宫!否则白白牺牲了 “);SuppressWarnings(“all“)class OtherPerson implements Callable Overridepublic Object call() throws Exception / 先休息休息再拼命去!Thread.sleep(5000);String result = “OtherPerson:经过一番厮杀取得葵花宝典“ ;System.out.println(result);return result;在这个例子中主线程代表东方不败,分线程代

8、表兄弟童柏雄,主线程派出FutureTask,把它放置于一个线程对象中,之后线程开始启动,分支线程开始工作。主线程也没闲着,继续做自己的事情,消毒,做着心理斗争等等,通过一个阻塞的死循环,等待分线程的状态,调用分线程的 futureTask.isDone()方法进行判断,看看兄弟是否执行结束了,结束了通过 futureTask.get()将分线程的执行结果取出来,结果出来了,主线程根据分线程的执行结果再做决定。执行后,结果大家都明了。有一点需要说明的是,有可能分线程与主线程的执行不在一台物理机器上,分线程可以使用jms、webservic、rmi 甚至 socket技术请求远程的类为其服务。分

9、线程根据远程返回的结果再返回给本机器的主线程,之后再做决策。分布式计算的核心原理也是如此,当然分布式计算比这个复杂得多,笔者只是说其核心的实现原理。3. SemaphoreSemaphore是限制多线程共享资源的一个东东,多线程并发访问一个资源的时候,可以限制线程最大使用个数,其他多出来的线程,没办法,耐心等着吧。这个例子在生活中比比皆是,在火车站售票处一共开设了 5个窗口,也就表示在同一时间内,火车站的工作人员最多只能为 5个人服务,那么高峰时其他人呢,理想的情况下是排队等着,不理想的情况下是,等待的队列没有秩序,有的只是拳头和权势,没有办法,人家的爸爸是李刚,撞人都没事何况是排队买票了,人

10、家说的就是王法。当然了,这个咱们看具体程序。package threadConcurrent.test;import java.util.Random;4 / 12import java.util.concurrent.Semaphore;/* 使用Semaphore ,限制可以执行的线程数,空闲资源放到队列中等待* * author liuyan*/public class SemaphoreDemo public static void main(String args) Runnable limitedCall = new Runnable() / 随机生成数final Random r

11、and = new Random();/ 限制只有3个资源是活动的 ,第二个参数为true则是按照标准“队列”结构先进先出final Semaphore available = new Semaphore(5, true);int count = 0;public void run() int time = rand.nextInt(10);int num = count+;try / 请求资源available.acquire();int needTime = time * 2000;System.out.println(“乘客“ + num + “买票需要 “ + needTime+ “

12、秒. #“);Thread.sleep(needTime);System.out.println(“乘客“ + num + “买完了 # !“);/ 运行完了就释放available.release(); catch (InterruptedException intEx) intEx.printStackTrace();5 / 12;for (int i = 0; i exgr = new Exchanger();new TeamB(exgr);new TeamA(exgr);11 / 12/* 项目组A* author liuyan*/class TeamA implements Runn

13、able Exchanger ex;String str;TeamA(Exchanger c) ex = c;str = new String();new Thread(this).start();public void run() char ch = A;for (int i = 0; i ex;String str;TeamB(Exchanger c) ex = c;new Thread(this).start();12 / 12public void run() for (int i = 0; i 3; i+) try str = ex.exchange(new String();System.out.println(“Got: “ + str); catch (InterruptedException exc) System.out.println(exc);需要说明的就是这种交换一定是成对儿的,就是交换的线程数目一定是偶数。否则奇数个线程,剩下那一个和谁交换去?这也是“等价交易”的一种体现。8. 总结这次主要介绍了并发环境下常常使用的并发包,用于控制多线程的并发调度、同步、交互、交换、协作等等。使用这些协作同步器,可以更灵活的处理线程之间的关系。也能更好地使用硬件资源为我们的并发系统提供高效率的运行能力。当然这次总结仅仅限于使用的层次,底层的实现源码分析有时间再做总结。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报