java多线程(9):线程状态

news2024/10/7 6:43:43

1 五大状态

2 线程方法

3 停止线程

  • 不推荐使用JDK提供的 stop()、 destroy()方法。【已废弃】
  • 推荐线程自己停止下来
  • 建议使用一个标志位进行终止变量 ,当flag=false,则终止线程运行。

package xiong.demo3;

public class TestStop implements Runnable{
    //1.设置一个标识位
    private  boolean flag = true;
    @Override
    public void run() {
        int i = 0;
        while(flag){
            System.out.println("run.....Thread"+i++);
        }
    }
    //2.设置一个公开的方法停止线程,转换标志位
    public void stop(){
        this.flag = false;
    }

    public static void main(String[] args) {

        TestStop testStop = new TestStop();
        new Thread(testStop).start();

        for (int i = 0; i < 1000; i++) {
            System.out.println("main"+i);
            if(i==900){
                //调用stop方法切换标志位,让线程停止
                testStop.stop();
                System.out.println("线程停止了");
            }
        }
    }
}

运行截图

4 线程休眠

  • sleep (时间) 指定当前线程阻塞的毫秒数; 1000 ms = 1s
  • sleep存在异常InterruptedException; 
  • sleep时间达到后线程进入就绪状态; 
  • sleep可以模拟网络延时,倒计时等。 
  • 每一个对象都有一个锁,sleep不会释放锁;

演示代码

模拟网络延时:放大问题的发生性。

package com.kaung.state;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;

//模拟倒计时
public class TestSleep {

    public static void main(String[] args) {
        //打印系统当前时间
        Date startTime = new Date(System.currentTimeMillis()); //获取系统当前时间

        while(true){
            try {
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                startTime = new Date(System.currentTimeMillis()); //更新时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //模拟倒计时
    public static void tenDown() throws InterruptedException {
        int num = 10;
        while(true) {
            Thread.sleep(1000);
            System.out.println(num--);
            if(num<=0){
                break;
            }
        }
    }
}

5 线程礼让

  • 礼让线程,让当前正在执行的线程暂停,但不阻塞
  • 将线程从运行状态转为就绪状态
  • 让cpu重新调度,礼让不一定成功!看CPU心情

代码模拟

package xiong.demo3;

public class TestYield {
    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread(myYield,"a").start();
        new Thread(myYield,"b").start();

    }
}

class MyYield implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程开始执行");
        Thread.yield();//线程礼让
        System.out.println(Thread.currentThread().getName()+"线程停止执行");
    }
}

运行结果

总结

礼让不一定成功,需要看cpu心情

6 Join

  • Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞
  • 可以想象成插队

代码

package xiong.demo3;

public class TestJoin implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("线程VIP来了"+i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //启动我们的线程
        TestJoin testJoin = new TestJoin();
        Thread thread = new Thread(testJoin);
        thread.start();

        for (int i = 0; i < 500; i++) {
            if(i==200){
                thread.join();
            }
            System.out.println("main"+i);
        }
    }
}

运行结果

根据运行结果可以看出,在join之前,两线程是交叉运行的,join后,要等join的线程执行完再执行下一个线程。

7 线程状态观测

JDk帮助文档

观察线程状态

package xiong.demo3;

public class TestState {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            for (int i = 0; i < 5; i++) { //让线程睡眠5s
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("///");
        });

        //观察状态
        Thread.State state = thread.getState();
        System.out.println("观察状态:"+state); //NEW


        thread.start();//启动线程
        state = thread.getState();
        System.out.println("启动线程:"+state); //RUN

        while(state != Thread.State.TERMINATED){ //只要线程不停止,就一直输出状态
            Thread.sleep(100);
            state = thread.getState();
            System.out.println("运行状态:"+state);
        }

    }
}

运行结果

 

线程一旦进入死亡状态,就不能再次启动了。

我们再来回顾一下这张图片。

8 线程优先级

  • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。
  • 线程的优先级用数字表示,范围从1~10。

        Thread.MIN_PRIORITY = 1; 

        Thread.MAX_PRIORITY = 10; 

        Thread.NORM_PRIORITY = 5; 

  • 使用以下方式改变或获取优先级 

getPriority() . setPriority(int xxx) 

==优先级的设定建议在start()调度前==

代码

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

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

相关文章

从DTCC2022盘点各大厂商如何看待数据库发展趋势

DTCC 2022 已落下帷幕有些时日&#xff0c;回顾大会上的一些分享&#xff0c;尤其是头一天上午几大数据库厂商均在演讲一开始纷纷表达了对数据库发展趋势的看法。从各个厂商的观点来看&#xff0c;对数据库发展趋势基本属于是不谋而合&#xff0c;未来数据库的样子离不开以下这…

MATLAB形态学的基本运算膨胀和腐蚀(开、闭运算)

形态学中两种基本的操作是膨胀和腐蚀&#xff0c;膨胀是指在图像中为其边界添加像素点&#xff0c;而腐蚀是其逆过程。对应的添加和移除像素点数依赖于处理图像结构元素矩阵的大小和形式。 一.膨胀处理 膨胀的运算符为⊕, A用B来膨胀写作A⊕B&#xff0c;MATLAB中提供了预定义…

小程序-小程序框架

目录 一&#xff0c;框架简介 响应的数据绑定 二&#xff0c;视图层 View WXML &#xff08;html&#xff09; WXSS 样式 JS 逻辑交互 三&#xff0c;事件 什么是事件 事件的使用方式 四&#xff0c;逻辑层 APP service 1&#xff0c;生命周期 生命周期演示 页面路…

快速排序(Java分治法)

快速排序&#xff08;Java分治法&#xff09; 文章目录快速排序&#xff08;Java分治法&#xff09;0、 分治策略1、思路步骤2、代码3、复杂度分析3.1 最好情况3.2 最坏情况3.3 平均情况3.4 性能影响因素4、合并排序VS快速排序5、参考0、 分治策略 快速排序是对气泡排序的一种改…

minio下载、安装、Java集成应用

1.下载MinIO 下载链接:https://dl.min.io/server/minio/release/windows-amd64/minio.exe 网盘:https://pan.baidu.com/s/1uS2ii958tTjnb0KTpsKpCg 提取码:3nr9 2.安装启动 下载好的文件不要双击,自己定义一个文件夹放下载好的文件,本文指定的位置D:\minio,同时创建一…

淮北绿金通过港交所上市聆讯:净利润再度下滑,收入依赖股东

12月27日&#xff0c;港交所披露的信息显示&#xff0c;淮北绿金产业投资股份有限公司&#xff08;下称“淮北绿金”&#xff09;通过港交所上市聆讯并递交了聆讯后招股书&#xff0c;光大证券国际为其独家保荐人。据了解&#xff0c;淮北绿金曾于2021年12月递表&#xff0c;20…

【答学员问】网站换ip后遇到的问题排查思路

文章目录遇到问题先进行基本的问题排查1. 查看IP2. 是否能通网3. 关闭防火墙和selinux4. 使用windows的浏览器访问问题复现1. 安装好wordpress &#xff0c;确保能够访问2. 修改IP&#xff0c;进行测试3. 访问测试&#xff1a;问题排查问题解决方案遇到问题 学员反馈在家访问网…

C++类和对象1:类是什么?对象是什么?

目录 类的引入 类的定义 类的定义规则 类域问题&#xff1a; 类的访问限定符及封装 访问限定符 封装 类的实例化 类对象的大小问题 this指针 This指针的一些特性&#xff1a; 类的引入 在学习C语言的时候&#xff0c;C语言是面向过程的&#xff0c;关注的是过程&#xff…

2023年5月北京老博会,医养家具展,护理床展,老年护理展

2023中国国际养老服务业博览会CISSE介绍&#xff1a; 2023中国国际养老服务业博览会&#xff08;CISSE&#xff09;将于5月5-7日在北京国家会议中心举行。大会以养老产业为主题&#xff0c;通过展贸平台为涉老企业抢占市场先机&#xff0c;对企业营销策略、宣传影响力、定位产品…

apt-fast 使用

apt-fast 使用1. 安装2. 使用默认的apt-get install&#xff0c;有时下载会非常的慢&#xff0c;尤其是安装的一些ppa包的时候。apt-fast 通过使用多线程来给apt提速&#xff0c;极大地提高了效率。 1. 安装 添加ppa仓库 sudo add-apt-repository ppa:apt-fast/stable 更新软…

CAPL学习之路-测试功能集函数(约束和条件)

在test module和test unit中,可以添加事件对象或事件文本作为条件或约束。当事件发生时,条件或约束受损,测试报告中输出“Fail”条目,同时测试用例判定为“Fail” 此类函数有: TestAddCondition/TestAddConstraint,添加事件对象或事件文本作为条件或约束。不管是作为条件…

傻白入门芯片设计,如何写一篇好文章(十八)

目录 一、标题Title 如何看浩如烟海的文献&#xff1f; 二、摘要Abstract 三、介绍Introduction &#xff08;1&#xff09;“六句扩展法” &#xff08;2&#xff09;常见的逻辑&#xff1a; &#xff08;3&#xff09;更好的逻辑&#xff1a; 四、相关工作Related wo…

《CSAPP》笔记——系统级IO、网络编程、并发编程

文章目录传送门系统级IOUnix输入和输出Unix文件Unix文件操作Unix管理打开文件打开文件流程文件共享重定向文件标准IO标准IO流标准IO的缓冲机制RIO&#xff08;Robust IO&#xff09;对比与总结网络编程历史从头构建互联网网络层次以太网段网桥连接的以太网段互联网网络协议互联…

远程代码执行渗透与攻防(一)

目录 前言 远程代码执行&#xff1a;Remote Code Execute 远程命令执行&#xff1a;Remote Command Execute 为什么要远程执行代码&#xff1f; 漏洞危害 近几年影响比较大的RCE漏洞 PHP RCE涉及函数 代码code注入&#xff1a; 命令command注入 &#xff1a; 靶场案…

Word控件Spire.Doc 【评论】教程(4):C#、VB.NET如何在Word的评论中插入图片

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

认真学习MySQL中锁机制(二)

接上文认真学习MySQL中锁机制&#xff08;一&#xff09;我们继续学习MySQL中的锁机制。 【5】按加锁的方式划分&#xff1a;显示锁、隐式锁 ① 隐式锁 一个事务在执行insert操作时&#xff0c;如果即将插入的间隙已经被其他事务加了gap锁&#xff0c;那么本次insert操作会阻…

分类算法KNN的python实现

作者&#xff1a;刘凡 KNN算法介绍 KNN算法是有监督学习中的分类算法&#xff0c;它是一种非参的&#xff0c;惰性的算法模型。非参的意思并不是说这个算法不需要参数&#xff0c;而是意味着这个模型不会对数据做出任何的假设&#xff0c;与之相对的是线性回归&#xff08;我…

隐语任务调度

隐语目前暂定支持的设备列表&#xff1a; 一 PYU 数据所有者是SecretFlow中的PYU设备&#xff0c;明文并成为PYU Objects一个PYU object&#xff08;明文&#xff09;可以被转化为秘密分享&#xff0c;被叫做SPU Object。Python函数可以被发送至SPU设备执行&#xff0c;背后是…

人工智能:图像数字化相关的知识介绍

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

只从 2022 年算起,谷歌就向社会输送了至少 26 位高端 AI 人才。

2022 年&#xff0c;人工智能在 AIGC、AI for science 等领域持续发展&#xff0c;一些工作也在知识型模型方面做出了探索。除了这些研究成果&#xff0c;我们还会发现这一年人工智能从业者的工作情况也有比较大的变化。 例如&#xff0c;Meta 等大型科技公司进行了大规模的裁…