// 暂停当前线程
LockSupport.park();// 恢复某个线程的运行
LockSupport.unpark(暂停线程对象)
先 park 再 unpark
public class Test1 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {log.debug("start...");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}log.debug("park...");LockSupport.park();},"t1");t1.start();TimeUnit.SECONDS.sleep(1);log.debug("unpark...");LockSupport.unpark(t1);}
}
输出:
20:20:59.373 [t1] DEBUG c.Test1 - start...
20:21:00.379 [t1] DEBUG c.Test1 - park...
20:21:01.371 [main] DEBUG c.Test1 - unpark...
先 unpark 再 park
public class Test1 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {log.debug("start...");try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}log.debug("park...");LockSupport.park();},"t1");t1.start();TimeUnit.SECONDS.sleep(1);log.debug("unpark...");LockSupport.unpark(t1);}
}
输出:
20:22:25.677 [t1] DEBUG c.Test1 - start...
20:22:26.677 [main] DEBUG c.Test1 - unpark...
20:22:27.685 [t1] DEBUG c.Test1 - park...
特点
与 Object 的 wait() 和 notify() 相比:
每个线程都有自己的一个 Parker 对象,由三部分组成 _counter,_cond 和 _mutex。
打个比喻,线程就像一个旅人,Parker 就像他随身携带的背包,条件变量就好比背包中的帐篷。_counter 就好比背包中的备用干粮(0 为耗尽,1 为充足),初始时为耗尽状态。
由于源码都是本地方法,所以只能通过原理说明。
先 park 再 unpark
先 unpark 再 park
下一篇:5、排序与分页