IT袋

当前位置:主页 > 经验教程 > 建站编程 >

线程的状态及转换

线程的状态及转换 线程的状态转换和转变

时间:2024-02-03 18:51:41 来源:IT袋 作者:马勇
导读:线程的状态及转换,今天分享:线程的状态及转换的相关介绍,下面来一起了解一下吧。 线程状态定义 Thread里面关于线程状态的定义: public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING,

线程的状态及转换

今天分享:线程的状态及转换的相关介绍,下面来一起了解一下吧。

线程状态定义

Thread里面关于线程状态的定义:

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

先看一个线程的状态图:

线程的状态及转换

NEW,TERMINATED

线程对象刚创建,还未执行start方法前的状态为NEW,初始状态;在线程执行完run方法里面的内容后的状态为TERMINATED,终止状态,线程已经执行完退出。

我们在JVM中监控线程时,这两个状态是看不到的。

RUNNABLE

线程对象执行完start方法后的状态,细分为Ready和Running两个形态,线程在抢到CPU时间片时,处于Running运行状态,执行run方法中的代码;

在未抢到CPU时间片或CPU时间片被操作系统分配给了其它线程时,线程处于Ready状态,等待获取CPU时间片执行线程。

BLOCKED

运行中的线程,在遇到synchronized代码块或方法时,等待获取锁对象时的状态,此状态表示线程不具备CPU执行资格,也没有CPU执行权限。

故此状态不占用CPU资源,等待获取对象锁后,线程再进入Ready状态。

本状态属于阻塞状态的一种,即等待获取锁对象时被阻塞。

WAITING

运行中的线程,在执行以下方法Object.wait()、 Thread.join()、LockSupport.park()时,状态由RUNNABLE变为WAITING。

此时线程不再占用CPU资源,直到被notify()后,再进入Ready状态,等待抢夺获取CPU时间片。

本状态属于阻塞状态的一种,即等待另一个线程执行某种操作之后,再继续执行自身线程。

下面为WAITING状态的代码:


class QueMsg{
    private int num = 0;
    public int getNum() {
        return num;
    }
    public synchronized int consumeMsg(){
        if(num>0) {
            return num--;
        }else{
            return 0;
        }
    }
    public void addMsg(int num){
        this.num += num;
    }
}

public void testWaiting(){
    QueMsg msg = new QueMsg();
    Thread consumer_a = new Thread(()->{
        while(msg.getNum() == 0){
            try {
                synchronized (msg) {
                    msg.wait();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            int m = msg.consumeMsg();
            if(m>0) {
                System.out.println("Consumer-A 当前状态:"+Thread.currentThread().getState()+" ---收到一条消息:" + m + " 退出");
                break;
            }
        }
    }, "Consumer-A");
    Thread consumer_b = new Thread(()->{
        while(msg.getNum() == 0){
            try {
                synchronized (msg) {
                    msg.wait();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            int m = msg.consumeMsg();
            if(m>0) {
                System.out.println("Consumer-B 当前状态:"+Thread.currentThread().getState()+" ---收到一条消息:" + m + " 退出");
                break;
            }
        }
    }, "Consumer-B");
    Thread producer = new Thread(()->{
        try {
            Thread.currentThread().sleep(10L);
        }catch(Exception e){
            e.printStackTrace();
        }
        msg.addMsg(1);
        System.out.println("Producer-C 发送一条消息,当前消息数量:"+msg.getNum());
        synchronized (msg) {
            msg.notifyAll();
        }
        try {
            Thread.currentThread().sleep(20L);
        }catch(Exception e){
            e.printStackTrace();
        }
        msg.addMsg(1);
        System.out.println("Producer-C 发送一条消息,当前消息数量:"+msg.getNum());
        synchronized (msg) {
            msg.notifyAll();
        }
    }, "Producer-C");
    System.out.println("Consumer_A创建后的状态:"+consumer_a.getState());
    System.out.println("Consumer_B创建后的状态:"+consumer_b.getState());
    consumer_a.start();
    System.out.println("Consumer_A在调用start后的状态:"+consumer_a.getState());
    consumer_b.start();
    System.out.println("Consumer_B在调用start后的状态:"+consumer_b.getState());
    producer.start();
    try {
        Thread.currentThread().sleep(5L);
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("--------------------------------------");
    System.out.println("Consumer_A 当前的状态:"+consumer_a.getState());
    System.out.println("Consumer_B 当前的状态:"+consumer_b.getState());
    try {
        Thread.currentThread().sleep(10L);
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("--------------------------------------");
    System.out.println("Consumer_A 当前的状态:"+consumer_a.getState());
    System.out.println("Consumer_B 当前的状态:"+consumer_b.getState());
    try {
        Thread.currentThread().sleep(40L);
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("--------------------------------------");
    System.out.println("Consumer_A 当前的状态:"+consumer_a.getState());
    System.out.println("Consumer_B 当前的状态:"+consumer_b.getState());
}

相关阅读

  • 什么是光电混合缆? 光电混合缆是指什么?

    什么是光电混合缆? 光电混合缆是指什么?

    IT电脑小知识篇,关于什么是光电混合缆方面的介绍,接下来一起来看看吧。 光电混合缆,又称光电一体化线缆,是一种综合了光纤和铜导线的电缆,允许在同一根线缆中传输数据和电力。 它

  • 双活数据中心是什么? 双活数据中心有哪些优点​

    双活数据中心是什么? 双活数据中心有哪些优点​

    今天带来的IT技巧小经验双活数据中心是什么方面的介绍,继续往下看吧! 双活数据中心是指在两个地理位置相距较远的地方建立至少两个数据中心,并在这些数据中心间运行实时应用程序。

  • mysql数据库基础知识是什么 数据库零基础入门教学

    mysql数据库基础知识是什么 数据库零基础入门教学

    今日小编为你讲解mysql数据库基础知识是什么和数据库零基础入门教学IT技巧方面的经验,请看下面详细的介绍。 MYSQL数据库简介 1、数据库就是存储数据的仓库,其本质是一个文件系统。数据

  • js数组分割函数 定义js数组的正确方法

    js数组分割函数 定义js数组的正确方法

    IT袋网为大家说一说js数组分割函数和定义js数组的正确方法的电脑小知识,下面小编为您详细解答 在创建程序时,有时需要将字符串进行分割划分为数组,这个时候我们可以使用split函数来实