在上一章节中咱们理解到线程怎么创立和执行。在理论开发过程中多线程是很容易呈现问题的,一不小心可能会导致死锁从而引起整个零碎解体。只有对线程的整个运行过程比拟理解能力及时地去找到问题在哪。不晓得大家有没有想过上面几个问题,

  1. 一共有哪些线程状态呢?
  2. 为什么要理解这些线程状态呢?
  3. 这些状态怎么查看呢?

我置信带着问题去学习是一种更高效的学习形式。接下来我会给小伙伴们一一找到答案。

上图是综合了线程个别状态和JVM中线程状态,其中红框期待timed_waiting、 期待waiting、阻塞blocked都是JVM的线程状态,JVM线程状态在JDK中有一个枚举类java.lang.Thread.State示意:

    public enum State {        /**         * 线程还没有启动时的状态         */        NEW,        /**         * 可运行状态。         */        RUNNABLE,        /**         * 进入synchronized同步代码块         */        BLOCKED,        /**         * 执行以下办法进入WAITING状态         * Object.wait         * Thread.join         * LockSupport.park         */        WAITING,        /**         * 执行以下带有工夫的办法进入TIMED_WAITING状态         * Thread.sleep(long)         * Object.wait(long)         * Thread.join(long)         * LockSupport.parkNanos         * LockSupport.parkUntil         */        TIMED_WAITING,        /**         * 终止或者沦亡状态         */        TERMINATED;    }

上面咱们通过代码和jstack命令演示下不同办法调用对一个的不同状态

  1. sleep(long)会使线程进入timed_waiting状态
    /**     * 调用sleep(long)线程处于timed_waiting状态     *     * @author jinglei     * @date 2020/8/21 13:09     */    public class TimedWaitingBySleep {        public static void main(String[] args) {            //1.sleep            Thread sleepThread = new Thread(new Runnable() {                @Override                public void run() {                    System.out.println("调用sleep()之后线程处于timed_waiting状态");                    try {                        Thread.currentThread().sleep(50000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            });            sleepThread.setName("mythread-sleep");            //启动线程            sleepThread.start();        }    }

运行程序,而后通过jps命令找到对应的过程id,再用jstack processId > D:/test/sleepTimedWaiting.log把线程堆栈输入到文件

文件内容如下图

能够看出mythread-sleep这个线程处于java.lang.Thread.State: TIMED_WAITING (sleeping)这个状态。