线程有哪几个状态
Thread.State定义了6种状态:
1、新建(NEW)
创建后尚未启动的线程处于此状态。
2、就绪状态(RUNNABLE)
线程对象创建后,其他线程调用了该对象的start() 方法。包括了操作系统线程状态的Running 和 Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待CPU给它分配执行时间。
3、阻塞(BLOCKED )
阻塞状态在等待着获取一个排他锁。
4、无限期等待(WAITING)
处于这个状态的线程不会被分配CPU执行时间,它们要等待被其他线程显式唤醒。
执行以下动作会进入这种状态:
Object#wait()
Thread.join()
LockSupport#park()
然后会等其它线程执行一个特别的动作,比如:
- 一个调用了某个对象的 Object.wait 方法的线程会等待另一个线程调用此对象的 Object.notify() 或 Object.notifyAll()。
- 一个调用了 Thread.join 方法的线程会等待指定的线程结束。
5、限时等待(TIMED_WAITING)
不会被分配CPU执行时间,一段时间后由系统自动唤醒。
执行以下方法会进入这种状态:
Thread.sleep
Object.wait(long)
Thread.join(long)
LockSupport.parkNanos
LockSupport.parkUntil
6、终止(TERMINATED)
线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
一个线程在给定时间点只能处于一种状态。这些状态是虚拟机状态,不反映任何操作系统线程状态。
java中的线程和操作系统中的线程分别存在于虚拟机和操作系统中,线程在创建时,其实是先创建一个java线程,等到本地存储、程序计数器、缓冲区等都分配好以后,JVM会调用操作系统的方法,创建一个与java线程绑定的原生线程。
线程的调度是由操作系统负责的。
当操作系统为线程分配好时间片以后,就会调用java线程的run方法执行线程。
当线程结束后,会释放java线程和原生线程所占用的资源。