发布日期:
2024-06-13
文章字数:
419
阅读时长:
1 分
阅读次数:
- Thread#sleep
- 必须指定休眠时间
- 休眠时线程状态为TIMED_WAITING
- 需要捕获InterruptedException异常
- 不会释放持有的锁
- Object#wait
- 可以通过notify唤醒,notify必须在wait之后执行,否则会丢失唤醒信号
- 休眠时线程状态为WAITING
- 需要捕获InterruptedException异常
- 会释放持有的锁
- 必须在synchronized内使用
- 无法唤醒指定的线程
- LockSupport#park
- 通过二元信号量实现的阻塞
- 休眠时线程状态为WAITING
- 无须捕获InterruptedException异常,但是也会响应中断
- 不会释放持有的锁
- 可以通过unpark唤醒,unpark方法可以比park先执行,不会丢失唤醒信号
- 可以指定任何线程进行唤醒
- LockSupport就是通过控制变量_counter来对线程阻塞唤醒进行控制的,原理有点类似于信号量机制
- 当调用park()方法时,会将_counter置为0,同时判断前值,小于1说明前面被unpark过,则直接退出,否则将使该线程阻塞
- 当调用unpark()方法时,会将_counter置为1,同时判断前值,小于1会进行线程唤醒,否则直接退出
- 为什么唤醒两次后阻塞两次会阻塞线程:连续调用两次unpark和调用一次unpark效果一样(_counter最大为1)
- pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用 pthread_cond_signal() 或pthread_cond_broadcast来唤醒它
- pthread_cond_signal()可以唤醒至少一个线程;发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行
- pthread_cond_broadcast()则是唤醒等待该条件满足的所有线程