一文搞懂java线程状态

线程状态

6个状态定义:java.lang.Thread.State

public static enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;

   
private State() {
    }
}

  1. NEW:尚未启动的线程的线程状态
  2. RUNNABLE:可运行线程的线程状态,等待CPU调度
  3. BLOCKED:线程阻塞等待监视器锁定的线程状态
  4. WAITING:等待线程的线程状态,不带超时的。方式有:Object.waitThread.joinLockSupport.park
  5. TIMED_WAITING:具有指定等待时间的等待线程的线程状态。方式有:Thread.sleepObject.waitThread.joinLockSupport.parkNanosLockSupport.parkUntil
  6. Terminated:终止线程的线程状态,即线程正常完成执行或者出现异常

 

线程状态图解:

 

从代码端查看线程状态:

第一种状态切换: 新建 -> 运行 -> 终止

输出:

 

 

 

第二种状态切换: 新建 -> 运行 ->等待 ->运行 -> 终止 (sleep方式)

 

输出:

 

 

 

 

第三种状态切换: 新建 -> 运行 ->阻塞 ->运行 -> 终止

 

输出:

 

 

 

完整代码:

package com.java_foundation.Thread;

/**
 * @program: java_foundation
 * @description: 多线程运行状态切换实例
 * @author: xiongbangwen <Email>xiongbangwen@163.com</Email>
 * @create: 2020-06-06 15:38
 **/
public class ThreadDemo_1 {
    public static Thread thread;
    public static ThreadDemo_1 obj;

    public static void main(String[] args) throws InterruptedException {
        //第一种状态切换: 新建 -> 运行 -> 终止
        System.out.println("======  第一种状态切换: 新建 -> 运行 -> 终止  ======");
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread1当前的状态: " + Thread.currentThread().getState().toString());
                System.out.println("thread1执行了" );
            }
        });
        System.out.println("没调用start方法,thread1当前状态: " + thread1.getState().toString());
        thread1.start();
        Thread.sleep(2000L);//等待thread1执行结束,再看状态
        System.out.println("等待两秒后,thread1当前状态:  " + thread1.getState().toString());
        //thread1.start(); 注意:线程终止之后,再进行调用会抛出IllegalThreadStateException异常

        System.out.println();
        System.out.println("------------------------------------------------------");
        System.out.println();
        //第二种状态切换: 新建 -> 运行 ->等待 ->运行 -> 终止 (sleep方式)
        System.out.println("======  第二种状态切换: 新建 -> 运行 ->等待 ->运行 -> 终止 (sleep方式)  ======");
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {//将线程2移动到等待状态,1.5s后自动唤醒
                    Thread.sleep(1500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread2当前的状态: " + Thread.currentThread().getState().toString());
                System.out.println("thread2执行了" );
            }
        });
        System.out.println("没调用start方法,thread2当前状态:" + thread2.getState().toString());
        thread2.start();
        System.out.println("调用了start方法,thread2当前状态:" + thread2.getState().toString());
        Thread.sleep(200L);//等待0.2秒再看状态
        System.out.println("等了0.2秒后,thread2状态:" + thread2.getState().toString());
        Thread.sleep(3000L);//等待3秒再看状态
        System.out.println("等了3秒后,thread2状态:" + thread2.getState().toString());

        System.out.println();
        System.out.println("------------------------------------------------------");
        System.out.println();
        //第三种状态切换: 新建 -> 运行 ->阻塞 ->运行 -> 终止
        System.out.println("======  第三种状态切换: 新建 -> 运行 ->阻塞 ->运行 -> 终止  ======");
        Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (ThreadDemo_1.class) {
                    System.out.println("thread3当前的状态: " + Thread.currentThread().getState().toString());
                    System.out.println("thread3执行了");
                }
            }
        });
        synchronized (ThreadDemo_1.class) {
            System.out.println("没调用start方法,thread3当前状态:" + thread3.getState().toString());
            thread3.start();
            System.out.println("调用了start方法,thread3当前状态:" + thread3.getState().toString());
            Thread.sleep(200L);//等待0.2秒再看状态
            System.out.println("等了0.2秒后,thread3状态:" + thread3.getState().toString());
        }
        Thread.sleep(3000L);//等待3秒再看状态
        System.out.println("等了3秒后,thread3状态:" + thread3.getState().toString());

    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值