欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图文并茂学"并发编程" - 线程的几种状态及其切换

程序员文章站 2022-05-04 20:56:30
...

线程的几种状态

  • 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
  • 运行(RUNNABLE):处于可运行状态的线程正在JVM中执行,但它可能正在等待来自操作系统的其他资源,例如处理器。
  • 阻塞(BLOCKED):线程阻塞于synchronized锁,等待获取synchronized锁的状态。
  • 等待(WAITING):Object.wait()、join()、 LockSupport.park(),进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
  • 超时等待(TIMED_WAITING):Object.wait(long)、Thread.join()、LockSupport.parkNanos()、LockSupport.parkUntil,该状态不同于WAITING,它可以在指定的时间内自行返回。
  • 终止(TERMINATED):表示该线程已经执行完毕。

线程几种状态代码演示

RUNNABLE状态

public class ThreadStateDemo {

    public static void main(String[] args) {

        //TODO 演示线程处于RUNNABLE状态
        new Thread(()->{
            try {
                //让线程保持RUNNABLE状态,等待键盘输入
                System.in.read();
            } catch (IOException e) {
                e.printStackTrace();
            }
        },"Thread-1").start();
    }
}

cmd窗口输入jconsole,打开 Java监视和管理控制台,查看ThreadStateDemo类中,Thread-1线程状态

图文并茂学"并发编程" - 线程的几种状态及其切换

BLOCK状态和TIMED_WAITING状态

public class ThreadStateDemo {

    public static void main(String[] args) throws InterruptedException {
        Object obj = new Object();

        //TODO 演示线程处于TIMED_WAITING状态
        new Thread(()->{
            synchronized (obj){
                try {
                    Thread.sleep(1000000000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"Thread-1").start();

        //让主线程休眠2毫秒,保证Thread-1先执行先占有锁obj
        Thread.sleep(2L);

        //TODO 演示线程处于BLOCK状态
        new Thread(()->{
            synchronized (obj){

            }
        },"Thread-2").start();

    }
}

使用jconsole查看控制窗口

图文并茂学"并发编程" - 线程的几种状态及其切换

Thread-1 等待 Thread.sleep(1000000000L) 执行结束,处于超时等待状态

图文并茂学"并发编程" - 线程的几种状态及其切换

Thread-2 等待 Thread-1 释放锁,处于阻塞状态

线程状态之间的转换

图文并茂学"并发编程" - 线程的几种状态及其切换

列举简单的几种状态转换:

状态1:创建 --》执行 --》终止

线程从创建到执行最后结束,是所有线程都会经历的

状态2:创建 --》执行 --》阻塞 --》执行 --》终止

线程从创建到执行,如果线程内部获取不到synchronized锁,线程就会处于阻塞状态,获取锁后线程回到执行状态,直到执行结束

状态3:创建 --》执行 --》超时等待 --》执行 --》终止

线程从执行到创建,如果线程内部发生类似于 Thread.sleep(1000000000L) 这样的操作,线程就会进入超时等待状态,直到sleep执行结束,线程回到执行状态,最后线程执行结束