IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 多线程--线程的六种状态 -> 正文阅读

[Java知识库]多线程--线程的六种状态

????????在多线程中,线程在不同的情况下会有不同的状态,了解线程的状态可以帮助我们更好的掌握多线程。

线程状态简介

????????在JDK8中,Thread一共有六种状态,它们被定义在一个枚举里,我们根据源码来大概看一下不同的状态的定义。

  • NEW (初始状态)

?

  • RUNNABLE(运行状态)

  • BLOCKED(阻塞状态)

  • WAITING(等待状态)

?

?

  • TIMED_WAITING(超时等待状态)

  • TERMINATED(终止状态)

对线程状态的理解

? ? ? ? 声明,下述均为本人个人见解,如有错误,还望批评指正(喷的时候轻一点,谢谢)

? ? ? ? 我们现在已经知道了线程有六大状态(初始状态,运行状态,阻塞状态,等待状态,超时等状态,终止状态),现在让我们根据代码来理解一下这几种状态。

? ? ? ? 初始状态就是线程刚刚被new出来的时候,是还没有调用strat()方法的状态。这也能解释为什么start()方法不能调用多次而run()可以,因为run()是执行线程的任务列表,而start()是改变线程的状态,二者本质上就不同。

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {

            }
        });

        System.out.println(thread.getState());
        thread.start();
        System.out.println(thread.getState());
    }

? ? ? ? 运行状态,其实应该是可运行状态,它代表当前线程可以运行或者正在运行。其实RUNNABLE状态可以细分为两个状态,或者说它代表了两个状态。这两个状态分别是RUNNING(正在运行状态),与READY(就绪状态)。很明显,RUNNING代表线程正在运行时的状态,而READY代表线程处于随时可以运行的状态。

? ? ? ? 阻塞状态,就是线程因为某种原因要暂时放弃CUP的执行权,停止运行,直到该线程进入就绪状态后,才有机会运行。等待状态和超时间等待状态其实也可以看作一种阻塞状态,只是阻塞的原因不同。

????????线程阻塞的部分原因?:

  • 睡眠状态

????????当线程调用sleep()方法时,线程就处于睡眠状态。该状态下线程不会释放锁对象。等线程睡眠时间一过,就会进入就绪状态。

    public static void main(String[] args) throws InterruptedException {
        Object sy = new Object();
        Thread t1 = new Thread(()->{
           synchronized (sy){
               try {
                   Thread.sleep(1000);//sleep时并不会释放锁资源
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
        });

        Thread t2 = new Thread(()->{
           synchronized (sy){
               System.out.println("t2执行了");
           }
        });
        t1.start();
        t2.start();
        Thread.sleep(100);//防止Main线程执行过快
        System.out.println("t2的状态是"+t2.getState());
    }

?

  • 等待状态

一个线程正在运行,如果调用了wait()方法,此时该线程会进入阻塞状态,并释放锁资源。进入这种状态不需要设置睡眠时间,但需要执行notify()或者notifyAll()对其进行唤醒,自己是不会主动醒来的。调用wait()属于无时间限制的WAITING状态。

  • 礼让状态

一个线程运行时如果执行yield方法,则其会将执行权让给其它线程,自己进入阻塞状态,但是不会释放锁。故该线程随时可能会又被分配到执行权。

  • 自闭状态

一个正在运行的线程内部调用了join()方法,此时该线程会进入阻塞状态,直到调用join()方法的线程运行结束,该线程才恢复就绪状态。这种阻塞属于无时间限制的WAITING状态。

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t1");

        Thread t2 = new Thread(()->{
            try {
                t1.join();//调用join方法
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t2");
        t1.start();
        t2.start();
        Thread.sleep(1000);//避免主线程太快结束而看不到结果
        System.out.println(t2.getName()+"处于"+t2.getState()+"状态");
    }

?线程阻塞也可能时争夺锁资源失败后进入阻塞状态,这比较常见。

????????最后,附上一副关于线程状态的图。

?这篇博客是偏向笔记类的博客,日后可能会修改,

都看到这了,不考虑点个赞评个论吗???

?

?

?

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:22:34  更:2022-04-22 18:25:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:28:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码