• 线程的状态


    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、因为一个没有捕获的异常,使得线程意外终止。

     

  • 相关阅读:
    4.正则提取html中的img标签的src内容
    Hudi第三章:集成Flink
    君正X2100 RTOS 固件升级
    Spring表达式语言(SPEL)学习(03)
    CTF 全讲解:[SWPUCTF 2022 新生赛]webdog1__start
    df -h 显示/根目录占100%
    3、构建实时数据仓库-ods和dim层构建
    Java 反射系列 —— 学习笔记
    OpenMP 教程(一) 深入剖析 OpenMP reduction 子句
    操作DOM对象(重点)
  • 原文地址:https://blog.csdn.net/dghehe/article/details/126896111