通过 LockSupport.park(); 阻塞的线程,可以通过下面两种方式唤醒:
- 通过 LockSupport.unpark(thread) 唤醒
- 使用中断 thread.interrupt() 唤醒
public static void main(String[] args) {
Thread t0 = new Thread(() -> {
Thread current = Thread.currentThread();
System.out.println("{},开始执行!"+current.getName());
for(;;){//spin 自旋
System.out.println("准备park住当前线程:{}...."+current.getName());
LockSupport.park();
System.out.println("当前线程{}已经被唤醒...."+current.getName());
}
},"t0");
t0.start();
try {
Thread.sleep(2000);
System.out.println("准备唤醒{}线程!"+t0.getName());
LockSupport.unpark(t0);
Thread.sleep(2000);
t0.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
执行结果:
{},开始执行!t0
准备park住当前线程:{}....t0
准备唤醒{}线程!t0
当前线程{}已经被唤醒....t0
准备park住当前线程:{}....t0
当前线程{}已经被唤醒....t0
准备park住当前线程:{}....t0
当前线程{}已经被唤醒....t0
准备park住当前线程:{}....t0
当前线程{}已经被唤醒....t0
准备park住当前线程:{}....t0
...