您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

让线程按顺序执行8种方法

时间:2019-09-05 11:20:16  来源:  作者:
作者:俊俊的小熊饼干
来源:https://www.cnblogs.com/wenjunwei/p/10573289.html

一.前言

本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:

[1] 使用线程的join方法
[2] 使用主线程的join方法
[3] 使用线程的wait方法
[4] 使用线程的线程池方法
[5] 使用线程的Condition(条件变量)方法
[6] 使用线程的CountDownLatch(倒计数)方法
[7] 使用线程的CyclicBarrier(回环栅栏)方法
[8] 使用线程的Semaphore(信号量)方法

二.实现

我们下面需要完成这样一个应用场景:

1.早上;2.测试人员、产品经理、开发人员陆续的来公司上班;3.产品经理规划新需求;4.开发人员开发新需求功能;5.测试人员测试新功能。

规划需求,开发需求新功能,测试新功能是一个有顺序的,我们把thread1看做产品经理,thread2看做开发人员,thread3看做测试人员。

1.使用线程的join方法

join():是Theard的方法,作用是调用线程需等待该join()线程执行完成后,才能继续用下运行。

应用场景:当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。

让线程按顺序执行8种方法

 

运行结果

早上:
测试人员来上班了…
产品经理来上班了…
开发人员来上班了…
产品经理规划新需求
开发人员开发新需求功能
测试人员测试新功能

2.使用主线程的join方法

这里是在主线程中使用join()来实现对线程的阻塞。

让线程按顺序执行8种方法

 

运行结果

产品经理来上班了
测试人员来上班了
开发人员来上班了
开发人员和测试人员休息会…
产品经理正在规划新需求…
产品经理新需求规划完成!
测试人员休息会…
开发人员开发新需求功能
测试人员测试新功能

3.使用线程的wait方法

wait():是Object的方法,作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)

notify()和notifyAll():是Object的方法,作用则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。

wait(long timeout):让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的notify()方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。

应用场景:JAVA实现生产者消费者的方式。

让线程按顺序执行8种方法

 


让线程按顺序执行8种方法

 

运行结果:这里输出会有很多种顺序,主要是因为线程进入的顺序,造成锁住线程的顺序不一致。

早上:
测试人员来上班了…
产品经理来上班了…
开发人员来上班了…
测试人员先休息会…
产品经理规划新需求…
开发人员开发新需求功能
测试人员测试新功能

4.使用线程的线程池方法

JAVA通过Executors提供了四种线程池

  • 单线程化线程池(newSingleThreadExecutor);
  • 可控最大并发数线程池(newFixedThreadPool);
  • 可回收缓存线程池(newCachedThreadPool);
  • 支持定时与周期性任务的线程池(newScheduledThreadPool)。

单线程化线程池(newSingleThreadExecutor):优点,串行执行所有任务。

submit():提交任务。

shutdown():方法用来关闭线程池,拒绝新任务。

应用场景:串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

让线程按顺序执行8种方法

 

运行结果

早上:
产品经理来上班了
测试人员来上班了
开发人员来上班了
领导吩咐:
首先,产品经理规划新需求…
然后,开发人员开发新需求功能…
最后,测试人员测试新功能…
产品经理规划新需求
开发人员开发新需求功能
测试人员测试新功能

5.使用线程的Condition(条件变量)方法

Condition(条件变量):通常与一个锁关联。需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例。

  • Condition中await()方法类似于Object类中的wait()方法。
  • Condition中await(long time,TimeUnit unit)方法类似于Object类中的wait(long time)方法。
  • Condition中signal()方法类似于Object类中的notify()方法。
  • Condition中signalAll()方法类似于Object类中的notifyAll()方法。

应用场景:Condition是一个多线程间协调通信的工具类,使得某个,或者某些线程一起等待某个条件(Condition),只有当该条件具备( signal 或者 signalAll方法被调用)时 ,这些等待线程才会被唤醒,从而重新争夺锁。

让线程按顺序执行8种方法

 


让线程按顺序执行8种方法

 

运行结果:这里输出会有很多种顺序,主要是因为线程进入的顺序,造成锁住线程的顺序不一致

早上:
测试人员来上班了…
产品经理来上班了…
开发人员来上班了…
测试人员先休息会…
产品经理规划新需求
开发人员开发新需求功能
测试人员测试新功能

6.使用线程的CountDownLatch(倒计数)方法

CountDownLatch:位于java.util.concurrent包下,利用它可以实现类似计数器的功能。

应用场景:比如有一个任务C,它要等待其他任务A,B执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

让线程按顺序执行8种方法

 


让线程按顺序执行8种方法

 

运行结果

早上:
测试人员来上班了…
产品经理来上班了…
开发人员来上班了…
产品经理规划新需求
开发人员开发新需求功能
测试人员测试新功能

7.使用CyclicBarrier(回环栅栏)实现线程按顺序运行

CyclicBarrier(回环栅栏):通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。

应用场景:公司组织春游,等待所有的员工到达集合地点才能出发,每个人到达后进入barrier状态。都到达后,唤起大家一起出发去旅行。

让线程按顺序执行8种方法

 


让线程按顺序执行8种方法

 

运行结果

早上:
测试人员来上班了…
产品经理来上班了…
开发人员来上班了…
产品经理规划新需求
开发人员开发新需求功能
测试人员测试新功能

8.使用Sephmore(信号量)实现线程按顺序运行

Sephmore(信号量):Semaphore是一个计数信号量,从概念上将,Semaphore包含一组许可证,如果有需要的话,每个acquire()方法都会阻塞,直到获取一个可用的许可证,每个release()方法都会释放持有许可证的线程,并且归还Semaphore一个可用的许可证。然而,实际上并没有真实的许可证对象供线程使用,Semaphore只是对可用的数量进行管理维护。

acquire():当前线程尝试去阻塞的获取1个许可证,此过程是阻塞的,当前线程获取了1个可用的许可证,则会停止等待,继续执行。

release():当前线程释放1个可用的许可证。

应用场景:Semaphore可以用来做流量分流,特别是对公共资源有限的场景,比如数据库连接。假设有这个的需求,读取几万个文件的数据到数据库中,由于文件读取是IO密集型任务,可以启动几十个线程并发读取,但是数据库连接数只有10个,这时就必须控制最多只有10个线程能够拿到数据库连接进行操作。这个时候,就可以使用Semaphore做流量控制。

让线程按顺序执行8种方法

 


让线程按顺序执行8种方法

 

运行结果

早上:
测试人员来上班了…
产品经理来上班了…
开发人员来上班了…
产品经理规划新需求
开发人员开发新需求功能
测试人员测试新功能

总结

看完了这么多种方法,是不是对多线程有了更深入的了解呢?不妨自己试试吧(代码拷贝均可运行)

使用的场景还有很多,根据开发需求场景,选择合适的方法,达到事半功倍的效果。



Tags:   点击:()  评论:()
声明:本站部分内容来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
中国发展新基建是大势所趋 《三国演义》第一回中提到的“天下大势,分久必合,合久必分”,从一定程度上揭示了一个规律,即许多看似偶然的事件只是构成必然状态的一个导火索。朝代...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
excel数据透视表的制作步骤很简单,选取表格 - 插入 - 数据透视表,但制作完成后还需要一列系的操作才能满足我们的要求,下面的10个最常用技巧是同学们必须掌握的。...【详细内容】
2020-07-10     点击:(2)  评论:(0)  加入收藏
Java 的BlockingQueue接口, java.util.concurrent.BlockingQueue, 代表着一个队列可以安全的插入和取元素.换句话说,多线程通过BlockingQueue安全的插入或者取元素,不会有任何...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
在程序运行期,创建目标对象的代理对象,对目标对象中的方法进行功能性增强的一种技术; 它就是JVM中,对象方法的拦截器write less do more!!回顾OOP(面向对象编程) 三大特征:封装、继承...【详细内容】
2020-07-10     点击:(1)  评论:(0)  加入收藏
在具体说明如何使用云桥模式之前,先简单介绍一下什么是坚果云的云桥模式。什么是坚果云的云桥模式?动图演示: 概念解释:安装或更新到Windows4.0+版本后,打开资源管理器,在“设备...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
上周同事小姐姐问我:“哈哥你看,我发现MySQL有bug,我下午为了清理磁盘,明明删除了100万条MySQL数据,磁盘不仅没有变小,反而更满了呢??”那你是怎么删除的?“delete from table 呀”“...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
[PConline 资讯] 不可否认,目前各种App、电商、出行、金融等众多互联网服务平台注册都需要手机号。但与此同时也会出现用户的隐私泄露、骚扰电话、垃圾短信等一系列问题,这对...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
网络时代,大多数衣食住行问题都能靠手机APP解决 可你是不是也发现了手机越来越像“肚子里的蛔虫”因为,我们想买什么、想看什么它都知道 其实这是网络追踪器在“作怪”目前有...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
随着互联网的不断发展,我们的生活变得越来越便利,其中改变最大的莫过于移动社交。说到移动社交服务行业,我想很多人都会想到微信,作为当前国内最受欢迎的社交APP之一,微信已经超...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
小伙伴们好啊,今天咱们再来分享一个有趣好玩的条件格式技巧——输入内容后,让Excel自动添加边框,先来看看效果: 只要在A列输入内容,Excel就会自动对这一行的A~C列区域...【详细内容】
2020-07-10     点击:(3)  评论:(0)  加入收藏
在使用Excel打印表格的时候,经常会遇到这种情况,表格太宽,一张纸打印不下,两张纸空白太多,显得很浪费。有没有什么办法能够将这样的表格缩放到一张纸上面打印出来呢? 这里给大家...【详细内容】
2020-07-10     点击:(1)  评论:(0)  加入收藏
平时在生活中,很多朋友都会使用到将PDF转换成Word文档。一般情况下PDF文件是不可以直接转换成Word文档的。那么用什么方法才能将PDF文档转换成Word呢!其实学会下面这3个方法就...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
我们在日常的工作和学习中,经常需要将文件格式进行转换,相信很多人都遇到这样的难题。最为常见的就是Excel与Word相互转换,如果复制粘贴,那么格式将会非常乱,这肯定不行。那么今...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
说到抠图,大家首先想到的肯定是"PS",虽然PS是一个比较好的抠图工具,但是PS的操作难度较高,很多朋友都不会使用。相对于PS来说,我们常用的PPT也有抠图功能,而且是一键抠图,操作很简...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
hello,这里是同捉。以前总觉得自己已经晋升办公界的大神,直到遇见了这6款办公黑科技网站后,才发现自己是只自大的井底之蛙。在频频遭遇“车祸”和“俗不可耐”的打击后,小编通...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
引言:在这次的慕尼黑电子展上,很多元器件方面的创新还是深刻的影响着汽车的发展,本文主要就村田展台上,汽车电子中使用的一些锂离子电池和传感器方面展开介绍。01 汽车电子应...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
相信很多人都遇到过被手机运营商(移动/电信/联通)误扣费的情况,今天笔者就用自己的亲身经历,教你一招如何让运营商补助你的损失。直接看笔者实例:时间起因:今天是笔者手机套餐月...【详细内容】
2020-07-10     点击:(1)  评论:(0)  加入收藏
手机号码被标记为快递、送餐或者企业,很困扰,如何才能取消呢?现实生活中,往往会遇到这样的情况:无缘无故自己的手机号码,不知道何时已经被标注成为某某企业或快递或者送餐.........【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
微信推出的信用产品支付分怎么开通?快捷教程教给你,往下看先下载“百度地图”进入后点击最下方蓝色的路线按钮 再点击上方的打车按钮,然后点击右侧个人中心 接下来会跳转登录界...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
针对微信群信息统计难这一问题,微信推出了群接龙功能那么我们本期就来简单的了解一下这个群接龙功能如何使用首先我们可以在微信搜索打开“接龙统计表”小程序进入小程序以后...【详细内容】
2020-07-10     点击:(0)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条