• 线程的状态


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

     

  • 相关阅读:
    选择振弦采集仪进行岩土工程监测时,根据不同工况选择合适的种类
    C# 实现迷宫游戏
    一图学会把Java程序打成jar包
    持续集成部署 - Jenkinsfile中单双引号的区别
    《ChatGPT:强大的人工智能聊天机器人》
    FPGA面试题(4)(跨时钟域处理)
    Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?
    C++ //练习 13.28 给定下面的类,为其实现一个默认构造函数和必要的拷贝控制成员。
    流量传感器原理介绍
    数字孪生应用方向展示
  • 原文地址:https://blog.csdn.net/dghehe/article/details/126896111