1.park方法可以暂停线程,线程状态为wait。
2.unpark方法可以恢复线程,线程状态为runnable。
3.LockSupport的静态方法。
4.park和unpark方法调用不分先后,unpark先调用,park后执行也可以恢复线程。
public class ParkDemo {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程t1->park....");
LockSupport.park(); //对应的线程状态wait
System.out.println("线程t1恢复运行....");
}, "t1");
t1.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程t1->unpark....");
LockSupport.unpark(t1);
}
}
public class ParkDemo {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程t1->park....");
LockSupport.park(); //对应的线程状态wait
System.out.println("线程t1恢复运行....");
}, "t1");
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程t1->unpark....");
LockSupport.unpark(t1);
}
}
5.park,unpark与wait,notify方法比较
- wait和notify必须要结合Object Monitor(synchronized锁)一起使用,而unpark和park则不需要。
- unpark是对指定线程进行唤醒,而notify是对任意一个等待线程唤醒,notifyAll是对所有等待的线程进行唤醒,没有那么精确。
- park与unpark,可以先unpark。而wait和notify,不能先notify。
6.park和unpark的底层原理(解释两个方法调用不分先后)
当线程调用park方法,检查_counter,如果为0,就获得_mutex互斥锁,线程进入_cond条件变量阻塞,然后再设置_counter=0。
当线程调用unpark的时候,把_counter设置为1,唤醒_cond阻塞队列中的线程,线程就恢复运行,又会把_counter设置为0。
如果先调用unpark方法,后调用park方法的原理分析:
调用unpark方法,_counter=1,_cond没有阻塞的线程,就结束了。然后调用的park方法,发现unpark=1,此时线程无需阻塞继续运行,然后设置_counter=0。