目录
park&unpark
wait,notify 和 park,unpark的区别
park unpark 原理
先调用park的情况
先调用park,在调用unpark的情况
先调用unpark,在调用park的情况
park和unpark都是LockSupport的方法,park用于暂停当前线程的运行,而unpark用于恢复该线程的运行.
我们看一下代码,来看看park和unpark怎么用?
@Slf4j(topic = "c.TestParkUnPark")
public class TestParkUnPark {public static void main(String[] args) throws InterruptedException {/*** 我们这个unpark既可以在park之前调用,也可以在park之后调用* 用来恢复暂停线程的运行*/Thread t1 = new Thread(() -> {log.debug("开始");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}log.debug("park");LockSupport.park();//暂停当前线程log.debug("resume...");},"t1");t1.start();Thread.sleep(1000);log.debug("unPark");LockSupport.unpark(t1);//恢复t1线程的运行}
}
先调用park,在调用unpark
先调用unpark在调用park
从这里我们就可以发现与wait和notify不同的一点,就是unpark在park之前调用还是在park之后调用都能唤醒该线程,而在使用wait和notify的时候,先调用notify,后调用wait,那么不会唤醒waitSet中的线程,应为已经错过通知的时间了,不会唤醒.
这里我总结一下wait,notify 和 park,unpark的区别
每一个线程都有一个parker对象,由三部分组成_counter(标志位),_condition(等待队列),_mutex(对象里面有等待队列)
我们可以打一个比喻.我们把线程当做一个旅游的人,Parker就像他随身携带的背包,条件变量就相当于背包中的帐篷,_counter就相当于背包中的备用干粮
总结一下 :
另外注意 ,counter只有两种状态0,1多次调用unpark还是为状态还是为1
参考 : 黑马程序员 Java并发编程