java线程状态

173 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Java线程中wait状态和block状态的区别?

  1. 初始态:NEW创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。

  2. 可运行态:RUNNABLE在Java中,运行态包括就绪态 和 运行态。

  • 就绪态 该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行。所有就绪态的线程存放在就绪队列中。
  • 运行态 获得CPU执行权,正在执行的线程。由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态的线程。
  1. 阻塞态:当一条正在执行的线程请求某一资源失败时,就会进入阻塞态。而在Java中,阻塞态专指请求锁失败时进入的状态。阻塞队列存放所有阻塞态的线程。

  2. 等待态:当前线程中调用wait、join、park函数时,当前线程就会进入等待态。等待队列存放所有等待态的线程。线程处于等待态表示它需要等待其他线程的指示才能继续运行。进入等待态的线程会释放CPU执行权,并释放资源(如:锁)

  3. 超时等待态:当运行中的线程调用sleep(time)、wait、join、parkNanos、parkUntil时,就会进入该状态;它和等待态一样,并不是因为请求不到资源,而是主动进入,并且进入后需要其他线程唤醒;进入该状态后释放CPU执行权 和 占有的资源。

  4. 终止态:线程执行结束后的状态。

注意:

  • wait()方法会释放CPU和占有的锁。
  • sleep(long)方法仅释放CPU使用权,锁仍然占用;线程被放入超时等待队列,与yield相比,它会使线程较长时间得不到运行。
  • yield()方法仅释放CPU执行权,锁仍然占用,线程会被放入就绪队列,会在短时间内再次执行。
  • wait和notify必须配套使用,即必须使用同一把锁调用;wait和notify必须放在一个同步块中调用wait和notify的对象必须是他们所处同步块的锁对象。

参考:

java线程运行怎么有第六种状态? - Dawell的回答 - 知乎

Java线程中wait状态和block状态的区别?