您当前的位置: 首页 >  leetcode

LeetCode 多线程 1114. 按序打印

发布时间:2022-01-08 13:09:56 ,浏览量:0

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 Lock class 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() 
关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    108697博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0760s