zl程序教程

您现在的位置是:首页 >  其他

当前栏目

线程的状态、状态之间的相互转换

2023-04-18 13:13:17 时间

目录

一、线程的状态

1. NEW

2. TERMINATED

3. RUNNABLE

4. TIMED_WAITING

5. BLOCKED

6. WAITING

二、线程状态转换

1. 线程状态转换简图


一、线程的状态

   线程的状态一共有 6 种:

  • NEW:安排了工作,还未开始行动(调用 start 方法之前)。
  • RUNNABLE:可工作的。又可分为正在工作中和即将开始工作。
  • BLOCKED:表示排队等着其他事情。(同步阻塞,因为资源竞争而引起的阻塞(锁))
  • WAITING:表示排队等着其他事情。(等待阻塞,需要其他线程唤醒)
  • TIMED_WAITING:表示排队等着其他事情。(计时等待阻塞,只等待一定的时间)
  • TERMINATED:工作完成了。

1. NEW

   把 Thread 对象创建好了,但是还没有调用 start。

    public static void main(String[] args) {
        Thread t = new Thread(() -> {

        });
        System.out.println(t.getState()); //输出 NEW
    }

2. TERMINATED

   操作系统中的线程已经执行完毕,销毁了,但是 Thread 对象还在时,获取到的状态就是TERMINATED。

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {

        });
        t.start();
        Thread.sleep(1000);
        System.out.println(t.getState()); //输出 TERMINATED 
    }

3. RUNNABLE

   就绪状态,处于这个状态的线程,就是在就绪队列中。即随时可以被调度到 CPU上。如果代码中没有进行 sleep ,也没有进行其他的可能导致阻塞的操作,代码大概率是处在 RUNNABLE 状态。

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while(true) {
                //这里什么都不能有
            }
        });
        t.start();
        Thread.sleep(1000);
        System.out.println(t.getState()); //输出 RUNNABLE
    }

    上述代码中,t 线程里一直持续不断的执行循环,随时系统向调度它上 CPU 都是可以的。

4. TIMED_WAITING

   代码中调度了 sleep(或者join(超时时间)) ,就会进入 TIMED_WAITING 状态。意思就是当前的线程在一定时间之内,是阻塞状态。一定时间结束后,阻塞状态解除。

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while(true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        Thread.sleep(1000);
        System.out.println(t.getState()); //输出 TIMED_WAITING
    }

    上述代码中,因为 t 线程循环内部只有 sleep 方法,所以该线程大概率一直处在 sleep 中,因此获取 t 线程状态显示 TIMED_WAITING。

5. BLOCKED

   当前线程在等待锁,导致了阻塞(阻塞状态之一)。使用 sychronized 时候,可能会出现该状态。

6. WAITING

   当前线程在等待唤醒,导致了阻塞(阻塞状态之一)。使用 wait 时候,可能会出现该状态。

二、线程状态转换

1. 线程状态转换简图