• 线程的状态


    NEW(新建)

    RUNNABLE(可运行)

    BLOCKED(阻塞)

    WAITING(等待)

    TIMED_WAITING(计时等待)

    TERMINATED:(终止)

    获取线程的状态使用getState()方法。

    几种状态之间的转换如下:

     1、new 新建状态

    当我们执行new来创造出一个线程实例的时候,此时线程就处于新建状态。新建状态就是程序已经安排好了工作,但是还没有开始执行任务,等待下一步操作。

    2、Runnable 可运行状态

    当我们创建好了线程实例,并且调用了start方法,程序就处于可运行状态,值得注意的是,在Java里面没有单独的把正在运行状态列为一个状态,而是把就绪状态和正在运行的状态统称为可运行状态Runnable。也就是说可运行状态中的线程分为两种就绪状态(ready)和正在运行状态(running)。

    一般在执行多线程的任务时,一个线程不是从头执行到结束的,而是不断切换执行的,让其他线程有机会执行,线程调度的细节取决于系统的调度,一般当正在执行的线程被切换下的时候,就绪状态的线程就会以抢占式执行的方式开启另一个线程执行,也就是新换上的线程是哪一个是随机的。

    我们也可以通过yield方法去结束一个线程的运行,该方法是一个静态方法。

    3、Blocked(阻塞)Waiting(等待)Timed_Waiting(计时等待)

     这三个状态类似

    阻塞状态:当一个线程试图获取一个对象锁,而这个锁已被占用(也就是发生锁竞争),该线程就会进入阻塞状态,直到其他的线程释放了锁,该线程就会进入可运行状态。

    等待状态:当线程等待另外一个线程通知调度器出现一个条件时,该线程就会进入阻塞状态。例如,调用join方法或者wait方法。此时的线程位于阻塞队列之中

    计时等待:调用sleep()计时方法,join()计时方法以及wait的一个重载版本可以传入时间作为参数,调用这些方法,线程就会进入计时等待状态,当时间到达时,线程会自动退出阻塞队列,变为就绪状态,也就是可运行状态。

    区别:Blocked状态表示是在等待获取锁,waiting和timed_waiting表示等待其他线程发来唤醒通知 

    timed_waiting是不会一直等下去,到达设定时间就自动退出该状态,waiting是无限期等待唤醒。

    4、Terminated 终止状态

    终止状态就是线程分配的任务已经全部完成,到达该状态有两种方法:

    1、线程运行完毕run方法自然退出。

    2、因为一个没有捕获的异常,使得线程意外终止。

     

  • 相关阅读:
    图像练习-计算平行线距离opencv(03)
    Arduino WIFI智能小车 无线视频遥控小车(论文+程序+原理图+驱动+安装手册等)
    【Python】利用matplotlib在Pycharm中显示本地图片
    LeetCode每日一题(502. IPO)
    原生微信小程序电影购票+后台管理系统[含文档]
    VB.NET 如何将某个Excel的工作表中复制到另一个的Excel中的工作表中https://bbs.csdn.net/topics/392861034
    Java-SpringBoot-使用多态给项目解耦
    如何在github上面找到想要的sdk以及Python使用Etcd集群基础教程
    第二&三章-项目运行环境&项目经理角色
    最强开源大模型面世:阿里发布Qwen2
  • 原文地址:https://blog.csdn.net/dghehe/article/details/126896111