JUC--Park & Unpark
JUC–Park & Unpark
-
JUC–Park & Unpark
-
博主以黑马JUC进行学习
基本使用
它们是LockSupport类中的方法
1 | //暂停当前线程 |
先park再unpark
1 | Thread t1 = new Thread(() -> { |
特点
与Object的wait& notify相比
- wait, notify 和 notifyAll 必须配合Object Monitor一起使用,而park,unpark不必
- park & unpark是以线程为单位来【阻塞】和【唤醒】线程,而notify只能随机唤醒一个等待线程,notifyAll是唤醒所有等待线程,就不那么【精确】
- park & unpark可以先unpark,而wait& notify不能先notify
原理
每个线程都有自己的一个Parker对象,由三部分组成_counter,_cond和_mutex
- 线程就像一个旅人,Parker就像是他随身携带的背包,条件变量就是背包中的帐篷。
_counter就好比背包中的备用干粮(0为耗尽,1为充足) - 调用park就是要看需不需要停下来歇息
- 如果备用干粮耗尽,那么钻进帐篷歇息
- 如果备用干粮充足,那么继续前进
- 调用unpark,就好比令干粮充足
- 如果这时线程还在帐篷,就唤醒让他继续前进
- 如果这时线程还在运行,那么下次他调用park时,仅是消耗掉备用干粮,不需停留继续前进
- 因为背包空间有限,多次调用unpark仅会补充一份备用干粮