Java并发-线程休眠与唤醒


  • 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()则是唤醒等待该条件满足的所有线程


文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录