线程状态说明及状态流转

Java中线程的状态分为6种。

各个状态怎么流转来的

就绪状态

  1. 调用线程的start()方法

  2. 当前线程sleep()方法结束

  3. 其他线程join()结束

  4. 等待用户输入完毕

  5. 某个线程拿到对象锁

  6. 当前线程时间片用完了,调用当前线程的yield()方法

  7. 锁池里的线程拿到对象锁后,进入就绪状态

运行中

从可运行池中选择一个线程作为当前线程时线程所处的状态。 这也是线程进入运行状态的唯一一种方式

阻塞状态

  1. 线程阻塞在进入synchronized关键字修饰的方法

  2. 或synchronized代码块(获取锁)时的状态

等待 WAITING

不会被分配CPU执行时间.

它们要等待被显式地唤醒. 否则会处于无限期等待的状态

超时等待

不会被分配CPU执行时间

不过无须无限期等待 被其他线程显示地唤醒. 达到一定时间后会自动唤醒

终止状态

  1. 当线程的run()方法完成时。或者主线程的main()方法完成时。 线程对象也许是活的,但是已经不是单独执行的了,一旦终止,不能复生

  2. 在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

等待队列

  1. 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) 代码段内。
  2. LockSupport.park()/LockSupport.parkNanos(long nanos),LockSupport.parkUntil(long deadlines) 等

Java线程的6种状态及切换