关于多线程:3线程一共有哪些状态呢

37次阅读

共计 1294 个字符,预计需要花费 4 分钟才能阅读完成。

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

  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)这个状态。

正文完
 0