【多线程】多线程的六种状态

前言

java多线程包含六种状态,分别是NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。

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

一、线程的六种状态

  • NEW:初始状态;在thread被new出来,但并没有调用start方法时,线程将处于这个状态。
  • RUNNABLE:运行状态(又具体分成正在运行状态和准备状态);当我们执行start方法后,线程状态变成该状态。
  • BLOCKED:阻塞状态;如果有其他线程持有锁,当该线程也要尝试拿锁的时候,就会进入到阻塞状态。
  • WAITING:等待状态;执行wait,join,park等方法时,线程就会进入等待状态。进行特定的操作才能从等待状态回到RUNNABLE状态。
  • TIMED_WAITING:有时间的等待状态;除了进行特定的操作解除等待外,还会因为时间到了自动解除等待。
  • TERMINATED:结束状态。正常运行完,或者终止都会进入到这个状态。

二、常见的状态迁移代码

1、新建 -> 运行 -> 终止

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(2000);
        System.out.println("等待2秒后线程状态" + thread1.getState().toString());

运行结果如下

没有调用start方法的thread1线程状态NEW
thread1当前状态RUNNABLE
thread1执行了
等待2秒后线程状态TERMINATED

2、新建 -> 运行 -> 等待 -> 终止

Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread2当前状态" + Thread.currentThread().getState().toString());
            }
        });
        System.out.println("thread2没调用start方法的线程状态" + thread2.getState().toString());
        thread2.start();
        System.out.println("thread2调用start方法后的线程状态" + thread2.getState().toString());
        Thread.sleep(200);
        System.out.println("等待200毫秒thread2的线程状态" + thread2.getState().toString());
        Thread.sleep(1500);
        System.out.println("等待1500毫秒,thread2的线程状态" + thread2.getState().toString());

运行结果如下

thread2没调用start方法的线程状态NEW
thread2调用start方法后的线程状态RUNNABLE
等待200毫秒thread2的线程状态TIMED_WAITING
thread2当前状态RUNNABLE
等待1500毫秒,thread2的线程状态TERMINATED

3、新建 -> 运行 -> 阻塞 -> 运行 -> 终止

Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (ThreadDemo.class) {
                    System.out.println("thread3当前状态" + Thread.currentThread().getState().toString());
                }
            }
        });

        synchronized (ThreadDemo.class) {
            System.out.println("thread3没调用start方法的线程状态" + thread3.getState().toString());
            thread3.start();
            System.out.println("调用start方法后,thread3的线程状态" + thread3.getState().toString());
            Thread.sleep(200);
            System.out.println("等待200毫秒,thread3线程状态" + thread3.getState().toString());
        }
        Thread.sleep(300);
        System.out.println("等待300后,线程状态" + thread3.getState().toString());

运行结果如下

thread3没调用start方法的线程状态NEW
调用start方法后,thread3的线程状态RUNNABLE
等待200毫秒,thread3线程状态BLOCKED
thread3当前状态RUNNABLE
等待300后,线程状态TERMINATED

三、多线程状态迁移图

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

你可能感兴趣的:(多线程,java,jvm)