一 . 概述
线程的整个生命周期是在不断切换其状态的.
在jdk中的Thread类之中有一个枚举类,在这个枚举类之中定义了线程的所有状态.
二 .线程的状态
public enum State { NEW, // 线程创建之后的状态,此时的线程对象不具有可运行行 RUNNABLE, // 线程调用start()方法之后具有的状态,此时线程是可以运行的,但是是否运行取决于时间片是否分配 BLOCKED, // 阻塞状态,线程由于未获得锁对象而进入阻塞队列之中 WAITING, // 线程由于调用了wait()等方法进行等待队列之中,需要等待信号才能重新进入可运行状态 TIMED_WAITING, // 由于调用了sleep(),wait(时间)等方法进行等待队列,当等待一段时间可以进入的可运行状态 TERMINATED; // 线程终结状态 }
上面的所有状态里面在加上一running状态总共有7个状态.
[1]new状态: 当一个线程创建之后就处于new状态.
[2]runnable状态: 就绪状态,该线程是可以在抢占了时间片之后就能运行.
[3]Terminated状态 : 线程终结之后就处于死亡状态.
[4]block状态: 线程因没有获得锁而被迫进入了锁池之中的状态,或者IO资源没有获取到,都是被迫进入的.
[5]waiting状态 : 线程主动进入等待池中,等待其他线程唤醒自己.
[6]time_waiting(sleep)状态: 线程主动进入睡眠状态.
[7]running(运行)状态:获取时间片的线程的状态,处于正在运行的状态中.
下面的图可以简单的描述上面线程状态的转换模型:
三 .线程状态转换
在上面线程的状态的描述其实无法很详细的,因为线程可能由于各种原因进行了状态的转换.
我们现在了解线程的状态:
这里需要各种的API,但是现在仅仅只是作为一个了解.
例子:
@Test public void test() { //创建了一个线程,此时线程处于new状态 Thread thread = new Thread(new Runnable() { @Override public void run() { try { //此时线程处于运行状态 Thread.sleep(300); //此时线程处于睡眠状态 } catch (InterruptedException e) { e.printStackTrace(); } // for(int i = 0 ; i <5 ;i++) System.out.println("running ..."); try { //陷入到了常量的一个等待池, //没有其他线程的唤醒,则该线程有缘都会等待该线程. "1".wait(); } catch (InterruptedException e) { e.printStackTrace(); } } }); thread.start(); //开启线程,线程就处于了runnable--就绪状态. }
在上面的例子中,我们展现了多个线程的状态.
但是现在还无法展现更多的状态的状态,当对线程的理解更深的情况下,我们就对这一部分的理解更好.