本章主讲线程的状态有哪些,以及他们之间的关系或切换,下面通过两个示例里展现

示例1:

public class ThreadStatus {
    public static void main(String[] args) {

        // TIME_WAITING
        new Thread(() -> {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(100);
                    System.out.println(Thread.currentThread().getName() + "---线程启动");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "TIME_WAITING").start();
        // WAITING
        new Thread(() -> {
            while (true) {
                synchronized (ThreadStatus.class) {
                    try {
                        ThreadStatus.class.wait();
                        System.out.println(Thread.currentThread().getName() + "---线程启动");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, "WAITING").start();
        // BLOCKED
        new Thread(new BlockDemo(),"BLOCKED_1").start();
        new Thread(new BlockDemo(),"BLOCKED_2").start();

    }
    static class BlockDemo extends Thread{
        @Override
        public void run() {
            synchronized (BlockDemo.class){
                while (true){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

        }
    }
}

通过jps 获取到pid 然后 通过jstack pid 获取线程状态 打印的信息:

"BLOCKED_2" #17 prio=5 os_prio=0 tid=0x000001fc7989a000 nid=0x486c waiting for monitor entry [0x0000009d656ff000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at smile.xiancheng.ThreadStatus$BlockDemo.run(ThreadStatus.java:47)
        - waiting to lock <0x00000007414018b0> (a java.lang.Class for smile.xiancheng.ThreadStatus$BlockDemo)
        at java.lang.Thread.run(Thread.java:748)

"BLOCKED_1" #15 prio=5 os_prio=0 tid=0x000001fc79897800 nid=0x4234 waiting on condition [0x0000009d655ff000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at smile.xiancheng.ThreadStatus$BlockDemo.run(ThreadStatus.java:47)
        - locked <0x00000007414018b0> (a java.lang.Class for smile.xiancheng.ThreadStatus$BlockDemo)
        at java.lang.Thread.run(Thread.java:748)

"WAITING" #13 prio=5 os_prio=0 tid=0x000001fc79877800 nid=0xe88 in Object.wait() [0x0000009d654fe000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x0000000740e4bbe0> (a java.lang.Class for smile.xiancheng.ThreadStatus)
        at java.lang.Object.wait(Object.java:502)
        at smile.xiancheng.ThreadStatus.lambda$main$1(ThreadStatus.java:28)
        - locked <0x0000000740e4bbe0> (a java.lang.Class for smile.xiancheng.ThreadStatus)
        at smile.xiancheng.ThreadStatus$$Lambda$2/1078694789.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)

"TIME_WAITING" #12 prio=5 os_prio=0 tid=0x000001fc79877000 nid=0x46c8 waiting on condition [0x0000009d653fe000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at java.lang.Thread.sleep(Thread.java:340)
        at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
        at smile.xiancheng.ThreadStatus.lambda$main$0(ThreadStatus.java:16)
        at smile.xiancheng.ThreadStatus$$Lambda$1/1324119927.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)

可以清晰的看到每一个线程后都有一个java.lang.Thread.State: 字样 代表着当前线程的状态

示例2: 代码:

public class ThreadStatus {
    public static void main(String[] args) {
        Thread thread1 = new Thread(()->{},"Thread-eleven-1");
        System.out.println(thread1.getName()+" 线程的线程状态为:"+thread1.getState());
        Thread thread2 = new Thread(()->{
            System.out.println(Thread.currentThread().getName()+" 线程的线程状态为:"+Thread.currentThread().getState());
        },"Thread-eleven-2");
        thread2.start();
        Thread blockTest = new Thread(new BlockDemo());
        blockTest.start();
        Thread thread3 = new Thread(new BlockDemo(), "Thread-eleven-3");
        thread3.start();
        System.out.println(thread3.getName()+" 线程的线程状态为:"+thread3.getState());

    }


    static class BlockDemo extends Thread{
        @Override
        public void run() {
            synchronized (BlockDemo.class){
                while (true){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

        }
    }


}

控制台输出:

Thread-eleven-1 线程的线程状态为:NEW
Thread-eleven-2 线程的线程状态为:RUNNABLE
Thread-eleven-3 线程的线程状态为:BLOCKED

代码:

Thread thread1 = new Thread(()->{
            while (true){
                try {
                    TimeUnit.SECONDS.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"Thread-eleven-测试");
        Thread thread2 = new Thread(()->{
            while (true){
                try {
                    thread1.join(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"Thread-eleven-4");
        thread1.start();
        thread2.start();
        System.out.println(thread1.getName()+" 线程的线程状态为:"+thread1.getState());
        System.out.println(thread2.getName()+" 线程的线程状态为:"+thread2.getState());

控制台输出:

Thread-eleven-测试 线程的线程状态为:RUNNABLE
Thread-eleven-4 线程的线程状态为:TIMED_WAITING

将代码中join方法的参数去掉后

Thread-eleven-4 线程的线程状态为:WAITING

代码:

Thread thread = new Thread(() -> {}, "Thread-eleven-6");
thread.start();
try {
   thread.join();
} catch (InterruptedException e) {
   e.printStackTrace();
}
System.out.println(thread.getName()+" 线程的线程状态为:"+thread.getState());

控制台输出:

Thread-eleven-6 线程的线程状态为:TERMINATED

通过上述简单的示例了解到线程的状态,接下来通过JAVA源码分析线程的状态是否只有这些呢?进入Thread.java

public enum State {

    NEW,

    RUNNABLE,

    BLOCKED,

    WAITING,

    TIMED_WAITING,

    TERMINATED;
}

总结线程的状态以及线程之间的切换: