1114. 按序打印

Ideas

并发执行问题是多线程要解决的经典问题,此题是典型的执行屏障问题,因此我们需要构造几把锁来确保执行顺序。

题目要求按顺序依次执行三个方法,为了保证线程的执行顺序,可以在方法之间创建一些锁,即第二个方法必须在第一个方法之后执行,第三个方法必须在第二个方法之后执行。

有两个依赖关系,所以我们定义两把锁,firstJobDone 和 secondJobDone,分别表示 first() 任务是否执行完毕和 second() 任务是否执行完毕。

我们来分析一下:

  1. 首先 first() 任务没有依赖关系,也就是说它可以直接执行,执行完之后更新 firstJobDone 变量;
  2. 然后 second() 任务需要 first() 任务执行完之后才能执行,也就是说 second() 任务执行之前需要检查 firstJobDone 变量,执行完之后更新 secondJobDone 变量;
  3. 同理,third() 任务需要 second() 任务执行完之后才能执行,也就是说 third() 任务执行之前需要检查 secondJobDone 变量;

Code

Python

from threading import Lockclass Foo:def __init__(self):self.firstJobDone = Lock()self.secondJobDone = Lock()self.firstJobDone.acquire()  # 一开始两个任务都没有执行过,先都锁上self.secondJobDone.acquire()def first(self, printFirst: 'Callable[[], None]') -> None:printFirst()self.firstJobDone.release()  # first() 任务执行完,解锁def second(self, printSecond: 'Callable[[], None]') -> None:with self.firstJobDone:printSecond()self.secondJobDone.release()def third(self, printThird: 'Callable[[], None]') -> None:with self.secondJobDone:printThird()

LeetCode 多线程 1114. 按序打印相关推荐

  1. 1114. 按序打印

    1114. 按序打印 我们提供了一个类: public class Foo { public void first() { print("first"); } public voi ...

  2. LeetCode 1114. 按序打印

    我们提供了一个类: public class Foo {public void first() { print("first"); }public void second() { ...

  3. LeetCode 1114 按序打印

    https://leetcode-cn.com/problems/print-in-order/ 解决方案 class Foo {private AtomicInteger jobDone = new ...

  4. LeetCode 多线程 1115. 交替打印FooBar

    1115. 交替打印FooBar Ideas 交替锁的设计,两把锁,foo执行的时候把foo lock acquire,print完了只有把bar lock release,这样foo就得等着,然后b ...

  5. (多线程)leetcode1114. 按序打印 认识AtomicInteger

    我们提供了一个类: public class Foo {   public void one() { print("one"); }   public void two() { p ...

  6. leetcode 多线程编程

    C++多线程学习博客推荐 1    C++11多线程编程----初识 2    c++11多线程编程(二)--理解线程类的构造函数 3    c++11多线程编程(三)--竞争条件与互斥锁 4    ...

  7. 多线程和单线程 打印数字到100000 的速度对比

    import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.u ...

  8. 【多线程】给三个字母a、l、i,采用多线程的方式打印alialialiali。。。

    目录 1. 题目 2. 解析 1. 使用ReetrankLock和Condition 1. 思路 2. 代码实现 3. 控制台 2. 使用synchronized和AtomicInteger配合 1. ...

  9. LeetCode 多线程 1116. 打印零与奇偶数

    1116. 打印零与奇偶数 Ideas 有几个线程就用几个信号量,最先开始的信号量初始化为1,其它初始化为0,然后根据条件判断实现同步. 多线程的问题好多都是:锁自己,解锁别人. Code from ...

最新文章

  1. 1.网页学习-开始学习第一步:
  2. 99% 人看得懂的“熔断”以及最佳实践
  3. python_环境测试
  4. Halcon 测量直线和圆环的线宽
  5. 2. sales quote merge before
  6. Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(5)
  7. java视频上传,播放预览,解决苹果手机视频无法预览的问题
  8. 酷派删除android系统软件,Coolpad酷派8720L哪些系统软件可以删除(精简列表)
  9. VS2005远程调试
  10. Xposed插件 - Android一键脱壳工具
  11. java实践课程感想_JAVA课程学习感想
  12. excel单元格数字拆分比较
  13. 求助:tp-link wr720n路由器,想刷打印服务器!
  14. 第十三课 类族结构的进化
  15. Office服务器意外响应,Office 所有使用过程中未响应,崩溃,意外关闭
  16. Basler相机Sdk采图的演示例程(C#)
  17. 领先华为鸿蒙,国产手机操作系统上载国产手机
  18. 人工智能-高等数学之微积分篇
  19. ubuntu Android Studio find in files 的快捷键 与搜狗输入法Linux版 简繁体切换快捷键冲突问题的解决办法【ctrl+ shift+F】
  20. 访问CentOS7光盘与配置开机挂载光盘

热门文章

  1. LeetCode 404. 左叶子之和(Sum of Left Leaves)
  2. 力扣(LeetCode) 35. 搜索插入位置
  3. Flutter - 弹出底部菜单Show Modal Bottom Sheet
  4. HDU - 3336 next运用+递推
  5. Spring Annotation(@Autowire、@Qualifier)
  6. jquery plugins
  7. [转]总结使用Unity 3D优化游戏运行性能的经验
  8. Linux select TCP并发服务器与客户端编程
  9. 交流电机数字控制系统_敲黑板!新型变频调速控制系统对交流电动机设计的特殊要求...
  10. 2021巢湖第一中学高考成绩查询,2021年巢湖高中录取分数线是多少及高中排名榜...