黑马视频教程:https://www.bilibili.com/video/BV16J411h7Rd?p=108
1.基本使用
park翻译
他和wait和notify有点像,都可以用来控制线程的状态。
它们是 LockSupport 类中的方法
// 暂停当前线程
LockSupport.park();
// 恢复某个线程的运行
LockSupport.unpark(暂停线程对象)
先 park 再 unpark。
示例代码,下面代码为线程t1先睡1s再调用LockSupport.park暂停线程,等待主线程2s后调用LockSupport.unpark方法唤醒t1线程。
@Slf4j
public class TestParkAndUnpark {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
log.debug("start...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("park...");
LockSupport.park();
log.debug("resume...");
}, "t1");
t1.start();
Thread.sleep(10000);
log.debug("unpark...");
LockSupport.unpark(t1);
}
}
测试结果
将主线程等待时间变为1s,先执行主线程的unpark方法。看看t1会不会在调用park时阻塞住。
Thread.sleep(1000);
log.debug("unpark...");
LockSupport.unpark(t1);
由结果可知并没有阻塞住,而是顺利执行完了。
2.特点
与 Object 的 wait & notify 相比与 Object 的 wait & notify 相比
- wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而park,unpark 不必
- park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么【精确】
- park & unpark 可以先 unpark,而 wait & notify 不能先 notify