【多线程】线程的状态

我们可以通过下面的这段代码来查看线程一共有哪几种状态

//线程的状态是一个枚举类型 Thread.State
for(Thread.State state : Thread.State.values()){
	System.out.println(state);
}

【多线程】线程的状态_第1张图片

NEW(新建状态): 当线程对象已经被创建,但是 start() 方法还没有被调用。
RUNNABLE(就绪状态):当线程已经调用了 start() 方法,线程已经在cpu上运行或等待运行。
TERMINATED(终止状态):说明当前线程已经工作结束,Thread 对象还在,但是内核上的线程已经销毁了。
TIMED_WAITING(有时限等待状态):与 WAITING 类似,但有一个超时时间限制,通常是由于调用了 sleep() wait(timeout) join(timeout) 等固定时间产生的阻塞。
WAITING(等待状态):当线程等待某个特定条件的发生,通常是由于调用了 wait()、join()或 park()等方法时,线程处于等待状态。
BLOCKED(阻塞状态):由锁竞争导致的阻塞。

我们来看下面的代码

public class demo {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    //此时t线程在sleep中获取的状态 可能是RUNNABLE 也可能是 TIMED_WAITING
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        System.out.println("t线程调用前状态:"+t.getState());
        //启动t线程
        t.start();
        //循环获取状态 总会把这两种状态都获取到 具体获取到哪个状态取决于系统调度
        for (int i = 0; i < 20; i++) {
            System.out.println("线程执行中状态:"+t.getState());
        }
        //让主线程等待t线程执行完
        t.join();
        //获取t线程结束后的状态
        System.out.println("t线程结束后:"+t.getState());
    }
}

【多线程】线程的状态_第2张图片
【多线程】线程的状态_第3张图片

在创建一个线程还没有start()的时候 ,它的状态就是 NEW ,调用start() 后也就是意味着线程进入就绪状态 也就是 RUNNABLE,等待系统调度。当执行任务时,遇到了 sleep() ,这个时候线程不会被分配cpu资源,此时线程的状态是 TIMED_WAITING ,当线程的任务执行完毕时也就是run() 方法结束,此时线程状态是 TERMINATED

你可能感兴趣的:(Java,java,开发语言,多线程)