三、线程状态【3/12】【多线程】

news2025/1/21 15:32:39

线程的状态

  • 3. 线程的状态
    • 3.1 观察线程的所有状态
    • 3.2 线程状态和状态转移的意义
    • 3.3 观察线程的状态和转移

3. 线程的状态

3.1 观察线程的所有状态

线程的状态是一个枚举类型 Thread.State

public class ThreadState {
    public static void main(String[] args) {
        for (Thread.State state : Thread.State.values()) {
            System.out.println(state);
       }
   }
}
NEW: 安排了工作, 还未开始行动
RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作. 
BLOCKED: 这几个都表示排队等着其他事情
WAITING: 这几个都表示排队等着其他事情
TIMED_WAITING: 这几个都表示排队等着其他事情
TERMINATED: 工作完成了.

3.2 线程状态和状态转移的意义

在这里插入图片描述在这里插入图片描述

大家不要被这个状态转移图吓到,我们重点是要理解状态的意义以及各个状态的具体意思在这里插入图片描述
还是我们之前的例子:
刚把李四、王五找来,还是给他们在安排任务,没让他们行动起来,就是 NEW 状态;
当李四、王五开始去窗口排队,等待服务,就进入到 RUNNABLE 状态。该状态并不表示已经被银行工作人员开始接待,排在队伍中也是属于该状态,即可被服务的状态,是否开始服务,则看调度器的调度;
当李四、王五因为一些事情需要去忙,例如需要填写信息、回家取证件、发呆一会等等时,进入BLOCKED 、 WATING 、 TIMED_WAITING 状态,至于这些状态的细分,我们以后再详解;
如果李四、王五已经忙完,为 TERMINATED 状态;
所以,之前我们学过的 isAlive() 方法,可以认为是处于不是 NEW 和 TERMINATED 的状态都是活着的;

3.3 观察线程的状态和转移

在这里插入图片描述

观察 1: 关注 NEW 、 RUNNABLE 、 TERMINATED 状态的转换

使用 isAlive 方法判定线程的存活状态.

public class ThreadStateTransfer {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 1000_0000; i++) {
           }
       }, "李四");
        System.out.println(t.getName() + ": " + t.getState());;
        t.start();
        while (t.isAlive()) {
            System.out.println(t.getName() + ": " + t.getState());;
       }
        System.out.println(t.getName() + ": " + t.getState());;
   }
}

观察 2: 关注 WAITING 、 BLOCKED 、TIMED_WAITING 状态的转换

public static void main(String[] args) {
    final Object object = new Object();
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (object) {
                while (true) {
                    try {
                        Thread.sleep(1000);
                   } catch (InterruptedException e) {
                        e.printStackTrace();
                   }
               }
           }
       }
   }, "t1");
    t1.start();
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (object) {
                System.out.println("hehe");
           }
       }
   }, "t2");
    t2.start();
}

使用 jconsole 可以看到 t1 的状态是 TIMED_WAITING , t2 的状态是 BLOCKED
修改上面的代码, 把 t1 中的 sleep 换成 wait

public static void main(String[] args) {
    final Object object = new Object();
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (object) {
                try {
                    // [修改这里就可以了!!!!!]
                    // Thread.sleep(1000);
                    object.wait();
               } catch (InterruptedException e) {
                    e.printStackTrace();
               }
           }
       }
   }, "t1");
 ...
}

使用 jconsole 可以看到 t1 的状态是 WAITING
结论:

  • BLOCKED 表示等待获取锁, WAITING 和 TIMED_WAITING 表示等待其他线程发来通知
  • TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在无限等待唤醒

观察-3: yield() 大公无私,让出 CPU

Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        while (true) {
            System.out.println("张三");
            // 先注释掉, 再放开
            // Thread.yield();
       }
   }
}, "t1");
t1.start();
Thread t2 = new Thread(new Runnable() {
    @Override
    public void run() {
        while (true) {
            System.out.println("李四");
       }
   }
}, "t2");
t2.start();

可以看到:

  1. 不使用 yield 的时候, 张三李四大概五五开
  2. 使用 yield 时, 张三的数量远远少于李四

结论:
yield 不改变线程的状态, 但是会重新去排队

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目7:(aliyun)实现短信的发送和验证微服务和上传文件删除文件微服务

项目7&#xff1a;实现短信的发送和验证 1.对gulimall-common补充 2.短信验证的流程&#xff08;aliyun的sms&#xff09; 3.具体接口的编写&#xff08;新建微服务service-sms&#xff09; 4.上传和删除文件流程&#xff08;aliyun的oss&#xff09; 5.具体接口的编写&am…

区块链智能合约开发学习

最近正在肝区块链知识学习&#xff0c;入手学习智能合约的开发&#xff0c;由于网上资料实在是太少了&#xff0c;好不容易东拼西凑完成了智能合约的开发、编译、部署、web3js调用&#xff08;网页页面&#xff09;和web3j调用&#xff08;java调用&#xff09;&#xff0c;赶紧…

Linux 内存回收,思维导图记录

最近天天跟内存斗智斗勇&#xff0c;整理下学习的记录 一些图片 参考 Tuning Linux Kernel Parameters For PostgreSQL Optimization PostgreSQL recommendations - Documentation for BMC Client Management 12.6 - BMC Documentation PostgreSQL load tuning on Red Hat E…

【vSphere | Python】vSphere Automation SDK for Python Ⅵ—— VM Guest Processes APIs

目录12. VM APIs12.1 VM Guest Processes APIsProcesses 进程Operations 操作&#xff08;1&#xff09;List Guest Processes&#xff08;2&#xff09;Get Guest Processes&#xff08;3&#xff09;Create Guest Processes&#xff08;4&#xff09;Delete Guest Processes参…

PaddleHub 更改模型默认下载位置

文章目录1.PaddleHub介绍2.PaddleHub安装3.PaddleHub使用中出现的问题4.更改PaddleHub模型的默认下载位置5. PaddleHub的简单使用1.PaddleHub介绍 PaddleHub 是基于 PaddlePaddle 开发的预训练模型管理工具&#xff0c;可以借助预训练模型更便捷地开展迁移学习工作&#xff0c…

docker内部执行nvidia-smi无任何显示的解决方法

docker内部执行nvidia-smi无任何显示的解决方法 贺志国 2023.4.11 今天在Docker内部编译程序&#xff0c;发现与CUDA相关的代码居然没有编译&#xff0c;于是在Docker内部执行Nvidia显卡驱动检测命令nvidia-smi&#xff0c;执行完毕后&#xff0c;无任何输出&#xff0c;也没…

计算机视觉面试题-网络结构相关问题总结-未完待续

VGG卷积核为什么取33 &#xff1f; VGG使用33卷积核的优势是什么? Resnet 主要解决什么问题 为什么会有ResNet&#xff1f; 深度网络退化的原因 Resnet的针对网络退化提出的残差网络 Resnet网络结构 Resnet网络结构中如何实现的下采样 Resnet50网络结构Resnet特点 vgg16与 res…

Java并发篇二

ForkJoin 在JDK1.7&#xff0c;并行执行任务&#xff0c;提高效率&#xff0c;大数据量才会使用 特点&#xff1a;大任务拆分成小任务&#xff0c;工作窃取&#xff0c;里面维护的是双端队列 package com.kuang.forkjoin;import java.util.concurrent.RecursiveTask;/*** 如…

(PCB系列三)AD六层板布线经验累积

目录 1、布局&#xff1a; 2、创建电源类PWR 3、高速部分可以加屏蔽罩&#xff0c; 4、EMMC和NANDFLASH采取兼容放置&#xff08;创建联合&#xff09; 5、HDMI设计 6、就近原则摆放 7、AV端口 8、模拟信号&#xff08;1字型或L型走线&#xff09; 9、WIFI模块 10、局…

研究生,但是一直在摆烂学不进去

好的&#xff0c;我来为您创作一首歌曲&#xff0c;希望能够帮助您每天保持自律&#xff0c;专注学习。 《自律之歌》 第1节&#xff1a; 每天都要努力 学习不停歇 独自一人也要坚持 不放弃自己的梦想 读文献 写论文 我们不停探索 穷孩子的荣耀 就在不远处等候 合唱&#xf…

面试手撕算法题--下一个排列

前言 面试官描述这个题的时候&#xff0c;我就感觉似曾相识似乎做过&#xff0c;面完以后到leetcode找到原题恨不得给自个儿来一下子&#xff0c;的确&#xff0c;当时调api爽了&#xff0c;然后呢面试被拷打了啊&#xff0c;我想不起来这个api具体怎么解决这个题目的底层原理…

【非递归】手搓快速排序

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 快速排序已经带大家实现过了&#xff0c;我们用到的方法是递归法&#xff0c;你知道吗&#xff0c;用循环也可以实现快速排序&#xff0c;来看看吧。 注&#xff1a; 这篇博客属于数据结构…

FE_CSS 基础选择器 字体属性 文本属性 综合案例

1 CSS 基础选择器 选择器分为基础选择器和复合选择器两个大类&#xff0c;基础选择器是由单个选择器组成的&#xff0c;基础选择器又包括&#xff1a;标签选择器、类选择器、id 选择器和通配符选择器。 1.1 标签选择器 标签名{属性1: 属性值1; 属性2: 属性值2; 属性3: 属性…

从0-1搭建交付型项目管理体系流程-- 项目启动篇【宝芝林5】

一. 目标及作用 本阶段主要的目标是签订合同及SOW工作说明书&#xff0c;其里程碑事件为甲乙双方完成合同及SOW工作说明书签字及盖章&#xff0c;以及召开项目启动会。 主要作用是明确项目甲乙双方的权利和义务&#xff0c;以及与甲方及其他实施团队共同制定项目章程&#xf…

有趣的Hack-A-Sat黑掉卫星挑战赛——被破坏的阿波罗计算机(解法一)

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加&#xff0c;太空已经成为国家赖以生存与发展的命脉之一&#xff0c;凝聚着巨大的国家利益&#xff0c;太空安全的重要性日益凸显[1]。而在信息化时代&#xff0c;太空安…

面试官:你做过什么有亮点的项目吗?

前言 面试中除了问常见的算法网络基础&#xff0c;和一些八股文手写体之外&#xff0c;经常出现的一个问题就是&#xff0c;你做过什么项目吗&#xff1f; 面试官其实是想看看你做过什么有亮点的项目, 其实大家日常做的项目都差不多&#xff0c;增删改查&#xff0c;登录注册&…

如何压缩照片到30kb以下?三个方法

如何压缩照片到30kb以下&#xff1f;随着网络的发展&#xff0c;我们经常要上传一些照片到网上&#xff0c;如公务员考试&#xff0c;教师招聘等&#xff0c;而且要求上传的照片大小不超过30kb&#xff0c;我们如何把照片压缩到30kb以下呢&#xff1f;现在很多平台上传图片时都…

【Arduino机器人手臂和麦克纳姆轮平台自动操作】

【Arduino机器人手臂和麦克纳姆轮平台自动操作】 1. 概述2. 构建 Arduino 机器人3. Arduino机器人电路图4. Arduino Code在本教程中,我将向您展示我如何从我以前的视频中制作我的 Mecanum Wheels 机器人平台,以便与我的 3D 打印机械臂协同工作并自动操作,这也是我之前视频之…

Redis高可用高性能缓存的应用系列03 - 缓存过期淘汰策略LRU、LFU

概述 Redis高可用高性能缓存的应用系列的第3篇&#xff0c;主要介绍Redis缓存过期淘汰策略和内存淘汰策略回收的LRU和LFU的知识点进行说明。 Redis过期键删除策略 Redis设置key时&#xff0c;都会设置一个过期时间&#xff0c;那么当过期时间到了都是怎么处理的&#xff1f;…

C++ 缺省参数 函数重载 引用

缺省参数&#xff0c;我们先看一下什么是缺省参数 首先&#xff0c;这个是我们的需要传参的函数&#xff0c;这里我们传入 1 然后就输出 a 下面我们就看一下缺省参数 我们现在看main函数里面调用fun函数&#xff0c;这里会输出多少呢&#xff1f; OK 这里我们分别输出了0 和 1…