Thread类中的常用线程方法

sleep

  1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
  2. 睡眠结束后的线程未必会立刻得到执行(重新参与cpu时间片分配中)
  3. 建议用 TimeUnit 的 sleep() 代替 Thread 的 sleep()来获得更好的可读性
  4. 当sleep过程中被中断时,会清除interrupt标记

wait

  • wait方法会等待一个线程运行完毕 , 期间会释放锁,直到另一个线程主动notify,重新拿到锁才能继续运行
  • wait方法需要与synchronized搭配使用

notify/ notifyAll

  • notify唤醒持有对象锁的线程(如果持有对象锁不止一个,则是随机唤醒,会导致虚假唤醒的情况)
  • notifyAll是唤醒所有持有该对象锁的线程,建议使用这个方法

yield

  1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后cpu重新调度线程
  2. 被yield的线程可能重新获得执行权

start 和 run的区别

  • 运行start:启动新的线程,通过新的线程间接执行 run()方法
  • 运行run:没有启动新的线程,是在主线程中执行了 run()方法

join

等待目前线程执行完毕,期间并不会释放锁,而是一直等待当前线程执行完毕。

interrupt

  • 打断阻塞线程:可以使用 interrupt 方法打断正在睡眠的线程,那么被打断的线程这时就会抛出一个 InterruptedException异常(注意:被打断的线程会有个打断标记使用wait、join会清除一个标记)
  • 打断正在运行的线程:例如,正在循环监听的一个while语句,这时候我们可以从外部使用interrupt,但interrupt不会终止循环。(循环里面可以通过判断打断标记的值来决定是否退出循环)
  • Thread.hread.interrupted() 返回打断标记,但是会清除打断状态 () 返回打断标记,但是会清除打断状态
  • isInterrupted():返回打断标记的布尔值

LockSupport

image.png
特点:

  • 与 Object 的 wait & notify 相比 wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必 (基于线程)
  • park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么【精确】
  • park & unpark 可以先 unpark,而 wait & notify 不能先 notify