继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java 多线程(三)之线程状态及其验证

慕婉清6462132
关注TA
已关注
手记 263
粉丝 14
获赞 86

线程状态 Thread.State

状态类型

在指定的时间点, 一个线程有且只有一种状态。 这些状态是 JVM 的状态, 他们并没有反映操作系统的状态。

定义

Thread 的状态是定义在 Thread 内部的枚举类型。

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

在定义中, 我们知道共有 6 种类型。

说明

状态说明
NEW至今尚未启动的线程处于这种状态
RUNNABLE正在 Java 虚拟机中执行的线程处于这种状态。 因为可能在等待其他的资源, 比如处理器。
BLOCKED受阻塞并等待某个监视器锁的线程处于这种状态
WAITING无限期地等待另一个线程来执行。某一特定操作的线程处于这种状态
TIMED_WAITING等待另一个线程来执行。取决于指定等待时间的操作的线程处于这种状态
TERMINATED已退出的线程处于这种状态

状态转换

借用 《Java 并发编程的艺术》图一张

https://img1.mukewang.com/5b8ba3850001902e07640522.jpg

从以上的图可以看出,

  1. 线程创建后未启动未 「NEW」 状态, 通过 start() 函数转换为 「RUNNABLE」状态。

  2. 「RUNNABLE」 状态通过各函数, 可以与「WAITING」、「TIMED-WAITING」、「BLOCKED」 进行双向切换。

  3. 「RUNNABLE」 状态在线程结束后转换为 「TERMINATED」 状态。

也就是说, 全部的状态是以 「RUNNABLE」 为中心的。

状态验证

「NEW」-> 「RUNNABLE」 -> 「TERMINATED」

创建一个实现 Runnable 的类

public class StateTestThread implements Runnable{    public StateTestThread() {        // 此时的线程还是 main
        System.out.println(Thread.currentThread().getName()+" state in Constructor:"+
                Thread.currentThread().getState());
    }    public void run() {
        System.out.println(Thread.currentThread().getName()+" state in Run:"+
                Thread.currentThread().getState());
    }
}

创建一个测试类

public class ThreadStateTest {    public static void main(String[] args) {
        StateTestThread stateTestThread = new StateTestThread();
        Thread thread = new Thread(stateTestThread);
        System.out.println(thread.getName()+" state after constructor:"
            +thread.getState());        try {
            Thread.sleep(1000L);
            thread.start();
            Thread.sleep(1000L);
            System.out.println(thread.getName()+" state after run:"
                +thread.getState());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行结果

https://img3.mukewang.com/5b8ba38d0001a1b003130066.jpg

「RUNNABLE」 -> 「TIMED_WAITING」

public class ThreadStateTest {    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {            public void run() {                long begin = System.currentTimeMillis();                for (int i = 0; i < (1 << 25); i++) {                    int j = (int) Math.sqrt(i);                    // 该条件永远不成立, 只是为了计算
                    if (j * j > i) {                        break;
                    }
                }                long end = System.currentTimeMillis();
                System.out.println("calculate end:"+(end - begin));                try {
                    System.out.println("begin sleep");
                    Thread.sleep(5000L);
                    System.out.println("end sleep");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });        try {
            thread.start();
            Thread.sleep(100L);
            System.out.println(thread.getName()+" state :"
                +thread.getState());
            Thread.sleep(1000L);
            System.out.println(thread.getName()+" state :"
                +thread.getState());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

结果如下:

https://img.mukewang.com/5b8ba3940001fdba02550100.jpg

Thread-0 的状态从 「RUNNABLE」 转化为 「TIMED_WAITING」

「RUNNABLE」 -> 「WAITING」

public static void main(String[] args) {
    Thread thread = new Thread(new Runnable() {
        final Object lock = new Object();        public void run() {
            synchronized (lock) {                try {                    lock.wait();
                } catch (InterruptedException e) {

                }
            }
        }
    });

    thread.start();
    System.out.println(thread.getName()+" state :"
        +thread.getState());    try {
        Thread.sleep(1000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(thread.getName()+" state :"
        +thread.getState());
}

运行结果

https://img1.mukewang.com/5b8ba39b000162cc02490036.jpg

「RUNNABLE」 -> 「BLOCKED」

先创建一个 Runnable 子类

public static void main(String[] args) {
    Thread thread = new Thread(new Runnable() {
        final Object lock = new Object();        public void run() {
            synchronized (lock) {                try {                    lock.wait();
                } catch (InterruptedException e) {

                }
            }
        }
    });

    thread.start();
    System.out.println(thread.getName()+" state :"+thread.getState());    try {
        Thread.sleep(1000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(thread.getName()+" state :"+thread.getState());
}

测试方法

public static void main(String[] args) {
    BlockedStateRun blockedStateRun = new BlockedStateRun();
    Thread thread1= new Thread(blockedStateRun);
    Thread thread2= new Thread(blockedStateRun);
    thread1.setName("First");
    thread1.start();
    thread2.setName("Second");
    thread2.start();    try {
        Thread.sleep(200L);
        System.out.println(thread1.getName()+"::"+thread1.getState());
        System.out.println(thread2.getName()+"::"+thread2.getState());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

最后的运行结果:

https://img1.mukewang.com/5b8ba3a20001955302150113.jpg

原文出处:https://www.cnblogs.com/homejim/p/9545581.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP