import threading

# 必须要使用condition的例子
# class XiaoAi(threading.Thread):
# def __init__(self, lock):
# super().__init__(name="小爱")
# self.lock = lock
#
# def run(self):
# self.lock.acquire()
# print("{} : 在 ".format(self.name))
# self.lock.release()
#
# self.lock.acquire()
# print("{} : 好啊 ".format(self.name))
# self.lock.release()
#
# class TianMao(threading.Thread):
# def __init__(self, lock):
# super().__init__(name="天猫精灵")
# self.lock = lock
#
# def run(self):
#
# self.lock.acquire()
# print("{} : 小爱同学 ".format(self.name))
# self.lock.release()
#
# self.lock.acquire()
# print("{} : 我们来对古诗吧 ".format(self.name))
# self.lock.release()
class XiaoAi(threading.Thread):
def __init__(self, cond):
super().__init__(name="小爱")
self.cond = cond def run(self):
with self.cond:
self.cond.wait()
print("{} : 在 ".format(self.name))
self.cond.notify() self.cond.wait()
print("{} : 好啊 ".format(self.name))
self.cond.notify() self.cond.wait()
print("{} : 君住长江尾 ".format(self.name))
self.cond.notify() self.cond.wait()
print("{} : 共饮长江水 ".format(self.name))
self.cond.notify() self.cond.wait()
print("{} : 此恨何时已 ".format(self.name))
self.cond.notify() self.cond.wait()
print("{} : 定不负相思意 ".format(self.name))
self.cond.notify() class TianMao(threading.Thread):
def __init__(self, cond):
super().__init__(name="天猫精灵")
self.cond = cond def run(self):
with self.cond:
print("{} : 小爱同学 ".format(self.name))
self.cond.notify()
self.cond.wait() print("{} : 我们来对古诗吧 ".format(self.name))
self.cond.notify()
self.cond.wait() print("{} : 我住长江头 ".format(self.name))
self.cond.notify()
self.cond.wait() print("{} : 日日思君不见君 ".format(self.name))
self.cond.notify()
self.cond.wait() print("{} : 此水几时休 ".format(self.name))
self.cond.notify()
self.cond.wait() print("{} : 只愿君心似我心 ".format(self.name))
self.cond.notify()
self.cond.wait() if __name__ == "__main__":
cond = threading.Condition()
xiaoai = XiaoAi(cond)
tianmao = TianMao(cond) #启动顺序很重要
#在调用with cond之后才能调用wait或者notify方法
xiaoai.start()
tianmao.start()

condition有两层锁:

1. 一把底层锁会在线程调用了wait方法的时候释放(是先创建一把锁(这就是第二把锁),然后再release),底层还是Lock或者RLock,

2.第二把锁会在每次调用wait的时候创建一把新的,并放入到cond的等待队列中(采用的是dqueue),一直acquire,等到notify方法的唤醒。notify方法会出队一把锁,这把锁就是刚刚创建的锁,然后release。

最新文章

  1. 微信公众帐号开发-消息创建时间long型与标准时间的互相转换
  2. 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)
  3. javascript 中的借鸡生蛋
  4. 如何运用inno在安装和卸载时提示用户结束进程?
  5. [iOS基础控件 - 6.10.3] DatePicker & UIToolBar
  6. iOS block的使用
  7. 如果使用的是orm,是否还需要关系索引
  8. 点击Input框弹出日期选项
  9. EIGRP系统复习【转载】
  10. Java解析YAML和Android解析YAML
  11. Eclipse中设置VM参数
  12. springMVC上传
  13. Ubuntu 18.04.1安装IntelliJ IDEA
  14. httpd-2.4基本使用及lamp基础(01)
  15. dell g3:安装ubuntu16.04 + CUDA8.0
  16. Python关键字及其用法
  17. (domain)域名协议
  18. Spring Boot + Spring Cloud 实现权限管理系统 (集成 Shiro 框架)
  19. [转]PHP资源列表
  20. How To Join XLA_AE_HEADERS and RCV_TRANSACTIONS(子分类账到事务处理追溯)

热门文章

  1. wcharczuk/go-chart图表上使用中文字体
  2. Git分布式版本控制器使用
  3. 17个常见的Python运行时错误
  4. PlayJava Day011
  5. JS中for,for...in,for...of以及foreach循环的用法
  6. Srping MVC ant路径匹配
  7. 一个匹配字字符串是aabbcc或者其他模式的运用
  8. iOS中的GCD线程
  9. fake_useragent.json
  10. 新版本的node,全局配置