加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

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

发布时间:2019-09-05 17:59:01 所属栏目:建站 来源:俊俊的小熊饼干
导读:一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下: [1] 使用线程的join方法[ 2] 使用主线程的join方法 [3] 使
副标题[/!--empirenews.page--]

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

一.前言

本文使用了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种方法

运行结果

  1. 产品经理来上班了 
  2.  
  3. 测试人员来上班了 
  4.  
  5. 开发人员来上班了 
  6.  
  7. 开发人员和测试人员休息会… 
  8.  
  9. 产品经理正在规划新需求… 
  10.  
  11. 产品经理新需求规划完成! 
  12.  
  13. 测试人员休息会… 
  14.  
  15. 开发人员开发新需求功能 
  16.  
  17. 测试人员测试新功能 

2.使用主线程的join方法

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

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

运行结果

  1. 产品经理来上班了 
  2.  
  3. 测试人员来上班了 
  4.  
  5. 开发人员来上班了 
  6.  
  7. 开发人员和测试人员休息会… 
  8.  
  9. 产品经理正在规划新需求… 
  10.  
  11. 产品经理新需求规划完成! 
  12.  
  13. 测试人员休息会… 
  14.  
  15. 开发人员开发新需求功能 
  16.  
  17. 测试人员测试新功能 

3.使用线程的wait方法

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

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

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

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

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

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

  1. 早上: 
  2.  
  3. 产品经理来上班了 
  4.  
  5. 测试人员来上班了 
  6.  
  7. 开发人员来上班了 
  8.  
  9. 领导吩咐: 
  10.  
  11. 首先,产品经理规划新需求… 
  12.  
  13. 然后,开发人员开发新需求功能… 
  14.  
  15. 最后,测试人员测试新功能… 
  16.  
  17. 产品经理规划新需求 
  18.  
  19. 开发人员开发新需求功能 
  20.  
  21. 测试人员测试新功能 

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

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

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

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

submit():提交任务。

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

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

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

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读