一、Java中两大等待唤醒机制
• 基于monitor机制的:Object类中的wait和notify方法。
–synchronized
• 基于线程的:LockSupport类中的park和unpark方法。
–juc包下的
1.1 unpark与notify最大的区别
unpark可以指定唤醒哪个线程;
notify是随机唤醒线程;
1.2 park和unpark方法演示
场景描述:
程序一旦启动,当遇到 LockSupport.park();的时候会被阻塞;
5s后,遇到 LockSupport.unpark(t0);,再次被唤醒,然后继续执行代码,最后结束。
@Slf4j
public class LockSupport_Thread {
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());
LockSupport.unpark(t0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果:
11:15:21.402 [t0] INFO com.yg.edu.lock.Juc01_Thread_LockSupport - t0,开始执行!
11:15:21.408 [t0] INFO com.yg.edu.lock.Juc01_Thread_LockSupport - 准备park住当前线程:t0....
11:15:26.446 [main] INFO com.yg.edu.lock.Juc01_Thread_LockSupport - 准备唤醒t0线程!
11:15:26.446 [t0] INFO com.yg.edu.lock.Juc01_Thread_LockSupport - 当前线程t0已经被唤醒....
11:15:26.446 [t0] INFO com.yg.edu.lock.Juc01_Thread_LockSupport - 准备park住当前线程:t0....