千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:重庆千锋IT培训  >  技术干货  >  使用ReentrantLock中的条件变量让多个线程顺序执行

使用ReentrantLock中的条件变量让多个线程顺序执行

来源:千锋教育
发布人:lxl
时间: 2023-03-08 14:52:55

千锋教育

  一. 前言

  近日一个学生在参加某公司校招面试时,遇到一个多个线程顺序执行的面试题,特意记录下来和大家分享一下,这个题目的具体要求是这样的:

  假设有3个线程 a,b,c,要求三个线程一起进入到就绪态,执行时一定要按照 a-->b-->c的顺序执行。即使a或者b线程进入到了阻塞态,也一定会按照a-->b-->c的顺序运行线程。请问该如何保证实现这个需求呢?

  二. 解决方案

  关于这道题,百度一下网上常见的实现思路,大致有4种解决方案:

  •   通过join()方法使当前线程“阻塞”,等待指定线程执行完毕后继续执行;
  •   通过倒数计时器CountDownLatch实现;
  •   通过创建单一化线程池 newSingleThreadExecutor()实现;
  •   通过ReentrantLock 中的条件变量实现;

  今天先使用ReentrantLock 的条件变量来实现这个题目中的需求。

  三. 使用ReentrantLock 条件变量

  首先咱们来了解一下,什么是ReentrantLock 条件变量(Condition)。

  ReentrantLock 中的条件变量功能,类似于普通 synchronized 的 wait、notify,我们可以使用Reentrantlock 锁,配合 Condition 对象上的 await()和 signal()或 signalAll()方法,来实现线程间协作。与synchronized的wait和notify不同之处在于,ReentrantLock中的条件变量可以有多个,可以实现更精细的控制线程。

  Condition中常用的方法API有如下这些:

使用ReentrantLock中的条件变量让多个线程顺序执行

  ReentrantLock代码实现:

使用ReentrantLock中的条件变量让多个线程顺序执行

使用ReentrantLock中的条件变量让多个线程顺序执行

使用ReentrantLock中的条件变量让多个线程顺序执行

  代码执行效果如下图:

使用ReentrantLock中的条件变量让多个线程顺序执行

  现在我们就会发现,3个线程已经可以被随意控制了,你会了吗?

  如上文所述,让多个线程按顺序执行,网上常见的解决方案有4种。但大家要注意的是,面试官出这个题有一个先决条件,“要让所有的线程同时就绪”,所以我们就可以排除使用join方法和使用单一化线程池的方案了。那么要想实现这个面试题中的需求,比较靠谱的方法只剩下ReentrantLock 中的条件变量和使用倒数计时器CountDownLatch两种方案了。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

java的输入语句—— Scanner类

2023-05-04

java数据库操作常识事务的四大特性

2023-05-04

DML数据操作之增加或删除数据

2023-05-04

最新文章NEW

socket是什么?有什么作用?

2023-05-04

Java常量定义是什么

2023-04-28

一分钟带你学多线程

2023-04-28

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>