发布于 

java线程状态

线程的状态

1、新建状态 (new)

  用 new 等方法创建了线程对象,但线程至今尚未启动。(下面说明怎么启动)

2、可运行状态 (runnable)

  创建线程对象后,其他线程(比如 main 线程)调用了该对象的 start() 方法启动。该状态的线程位于可运行线程池中,等待被线程调度选中,获取 cpu 的使用权 。

3、运行状态 (running)

  在可运行状态(runnable) 的基础上获得了 cpu 时间片(timeslice)的线程,称运行状态的线程,在这执行程序代码。

4、阻塞状态 (block)

  阻塞状态是指线程因为某种原因放弃了 cpu 使用权,即让出了 cpu 时间片(timeslice),暂时停止运行。直到线程进入可运行(runnable) 状态,才有机会再次获得 cpu 时间片(timeslice)转到运行 (running) 状态。阻塞的情况分三种:
  (1)、 等待阻塞:运行 (running) 的线程执行 wait()方法,JVM 会把该线程放入等待队列 (waitting queue) 中。
  (2)、 同步阻塞:运行 (running) 的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池 (lock pool) 中。
  (3)、 其他阻塞:运行 (running) 的线程执行 Thread.sleep(long ms)或 t.join()方法,或者发出了 I/O 请求时,JVM 会把该线程置为阻塞状态。当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入可运行 (runnable) 状态。

5、死亡 (dead)

  线程 run()、main() 方法执行结束,或者因异常退出了 run() 方法,则该线程结束生命周期。死亡的线程不可再次复生。

线程的状态转换图

线程中一些方法的解释

  Thread.yield():暂停当前正在执行的线程对象,并执行其他线程。使有相同优先级的线程有机会执行。
  join():( 必须要在线程启动后才能使用)调用 join() 方法的线程将被优先执行,直到此线程运行结束,当前线程才能继续运行。 调用 join(long mills)方法的线程将被优先执行,直到此线程运行结束或者经过 mills 时间,当前线程才能继续运行。
  sleep(): 让线性休眠,必须指定时间,时间到了后,线程会自动醒来,在休眠的时候,不会释放锁的所有权,当休眠时间到后,会继续执行
  wait(): 让线程暂停,可以指定时间,也可以不指定,可以通过 notity、notityAll 释放锁的所有权。