JAVA线程的生命周期状态

一、线程的生命周期图示

avatar

二、Java线程的状态

2.1 Thread里的枚举State

在Java.lang.Thread里,有个内部枚举: State,一个线程在某一时刻可以是State里的一种状态。

public enum State {

        /**
         * 线程还没有被启动(start)的状态
         */
        NEW,

        /**
         * 线程可以被JVM执行的状态
         */
        RUNNABLE,

        /**
         * 线程由于监控锁被阻塞的状态
         */
        BLOCKED,

        /**
         * 线程被无限期等待的状态
         */
        WAITING,

        /**
         * 线程等待指定的时间
         */
        TIMED_WAITING,

        /**
         * 线程被终止的状态 
         */
        TERMINATED;
    }

2.2 NEW

已经创建了一个线程,但是还未被启动的状态。由于一个线程实例只能被启动一次,因此每个线程在线程的生命周期中只可能有一次处于NEW状态。

2.3 RUNNABLE

其实当线程处于RUNNABLE状态的时候,并不代表该线程已经在运行了。我们可以拆分成两个状态:READY和RUNNING。前者表示可以被线程调度器进行调度而处于RUNNING状态。后者表示该线程正在运行,如果在运行过程中,执行了Thread.yield(),其状态可能又变成了READY状态。

2.4 BLOCKED

一个线程发起了阻塞式I/O操作后,或者申请了一个已经被其他线程占有的独占锁时候,会处于BLOCKED状态。该状态下的线程并不会占用资源处理器。当阻塞式I/O操作完成后,或者其获取到独占锁的时候,就会变成RUNNABLE状态。

2.5 WAITING

一个线程执行了某些特定方法后,就会处于这种等待其他线程执行完另外一些特定操作的状态。

2.6 TIMED_WAITING

和WAITING状态类似,只不过该状态不会无限期等待其他线程执行完另外一些操作而已,而是到时间就会自动转化成RUNNABLE状态。

2.7 TERMINATED

已经结束的线程处于此种状态。一个线程实例只能被启动一次,也就意味着一个线程在线程的生命周期中只可能有一次处于TERMINATED状态。Thread.run()正常返回或者在执行过程中抛出异常都有可能使线程处于此状态。

posted @ 2019-08-03 20:08  Kobelieve  阅读(490)  评论(0编辑  收藏  举报