1. LockSupport的作用
- LockSupport.park() 让当前线程阻塞
LockSupport.unpark(t0) 唤醒to线程,需指定被唤醒的线程
2. 演示
我们创建一个t0线程,该线程内部的run()方法体内实现一个循环打印,但是每次循环时,会调用LockSupport阻塞当前的t0线程,主线程会唤醒一次t0,然后下次循环时会再次陷入循环,这次,就没人再去唤醒t0了,只好永远阻塞下去:
package com.test;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.LockSupport;
@Slf4j
public class Thread_LockSupport {
public static void main(String[] args) {
Thread t0 = new Thread(new Runnable() {
@Override
public void run() {
Thread current = Thread.currentThread();
log.info("{},开始执行!",current.getName());
for(;;){//spin 自旋
log.info("准备park住当前线程:{}....",current.getName());
//阻塞当前线程,等待被唤醒
LockSupport.park();
log.info("当前线程{}已经被唤醒....",current.getName());
}
}
},"t0");
t0.start();
try {
Thread.sleep(5000);
log.info("准备唤醒{}线程!",t0.getName());
//唤醒t0线程
LockSupport.unpark(t0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行结果:
22:02:38.715 [t0] INFO com.test.Thread_LockSupport - t0,开始执行!
22:02:38.741 [t0] INFO com.test.Thread_LockSupport - 准备park住当前线程:t0.... `产生了阻塞,等待唤醒`
22:02:43.889 [main] INFO com.test.Thread_LockSupport - 准备唤醒t0线程!
22:02:43.889 [t0] INFO com.test.Thread_LockSupport - 当前线程t0已经被唤醒.... `5s钟后,线程再次被主线程被唤醒,继续执行了该打印`
22:02:43.889 [t0] INFO com.test.Thread_LockSupport - 准备park住当前线程:t0.... `t0再次陷入阻塞,永远阻塞下去`