• 线程状态


    线程状态

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

    1. New: 尚未启动的线程的线程状态

    2. Runnable: 可运行线程的线程状态, 等待CPU调度

    3. Blocked: 线程阻塞, 等待监视器锁定的线程状态

    4. Waiting: 等待线程的线程状态, 下列不带超时的方式: Object.wait, Thread.join, LockSupport.park

    5. Timed Waiting: 具有指定等待时间的等待线程的线程状态, 下列带超时的方式: Thread.sleep, Object.wait, Thread.join, LockSupport.parkNaons, LockSupport.parkUntil

    6. Terminated: 终止线程的线程状态, 线程正常执行完或者出现异常

    img

    代码测试

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

        // 第一种状态切换 - 新建 -> 运行 -> 终止
        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(); TODO 注意,线程终止之后,再进行调用,会抛出IllegalThreadStateException异常
    

    输出结果:

    #######第一种状态切换  - 新建 -> 运行 -> 终止################################
    没调用start方法,thread1当前状态:NEW
    thread1当前状态:RUNNABLE
    thread1 执行了
    等待两秒,再看thread1当前状态:TERMINATED
    

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

        System.out.println(
            "############第二种:新建 -> 运行 -> 等待 -> 运行 -> 终止(sleep方式)###########################");
        Thread thread2 =
            new Thread(
                new Runnable() {
                  @Override
                  public void run() {
                    try { // 将线程2移动到等待状态,1500后自动唤醒
                      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); // 等待200毫秒,再看状态
        System.out.println("等待200毫秒,再看thread2当前状态:" + thread2.getState().toString());
        Thread.sleep(3000L); // 再等待3秒,让thread2执行完毕,再看状态
        System.out.println("等待3秒,再看thread2当前状态:" + thread2.getState().toString());
    

    输出结果:

    ############第二种:新建 -> 运行 -> 等待 -> 运行 -> 终止(sleep方式)###########################
    没调用start方法,thread2当前状态:NEW
    调用start方法,thread2当前状态:RUNNABLE
    等待200毫秒,再看thread2当前状态:TIMED_WAITING
    thread2当前状态:RUNNABLE
    thread2 执行了
    等待3秒,再看thread2当前状态:TERMINATED
    

    第三种:新建 -> 运行 -> 阻塞 -> 运行 -> 终止

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

    输出结果:

    ############第三种:新建 -> 运行 -> 阻塞 -> 运行 -> 终止###########################
    没调用start方法,thread3当前状态:NEW
    调用start方法,thread3当前状态:RUNNABLE
    等待200毫秒,再看thread3当前状态:BLOCKED
    thread3当前状态:RUNNABLE
    thread3 执行了
    等待3秒,让thread3抢到锁,再看thread3当前状态:TERMINATED
    

  • 相关阅读:
    最大流基础
    转一篇写期望的日志
    poj3267The Cow Lexicon(dp)
    poj3026Borg Maze(bfs+MST)
    poj2226Muddy Fields(二分图的最小点覆盖)
    poj1035Spell checker(字符串模拟)
    poj1422Air Raid(最小路径覆盖)
    poj3020Antenna Placement(最小路径覆盖)
    [JSOI2009]火星藏宝图
    [SHOI2007]书柜的尺寸
  • 原文地址:https://www.cnblogs.com/coding-diary/p/11160937.html
Copyright © 2020-2023  润新知