Thread的基础用法

news2024/11/17 13:27:11

在这里插入图片描述

作者简介: zoro-1,目前大二,正在学习Java,数据结构,mysql,数据结构,javaee等
作者主页: zoro-1的主页
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

Thread的基础用法

  • 属性
    • ID
    • 名称
    • 状态
    • 优先级
    • 是否是后台进程
    • 是否存活
    • 是否被中断
      • 方法一:利用一个boolean类型变量
      • 方法二:利用Thread自带的api来操作
        • **sleep为什么要清除标志位呢?**
  • 等待线程
    • sleep
    • join

属性

在这里插入图片描述

ID

jvm自动分配的身份标识,不重复

名称

当前线程的名字,可以通过Thread的构造方法设置,可以重复

状态

• NEW:安排了⼯作,还未开始⾏动
• RUNNABLE:可⼯作的.⼜可以分成正在⼯作中和即将开始⼯作.
• BLOCKED:这⼏个都表⽰排队等着其他事情(锁竞争引起)
• WAITING:这⼏个都表⽰排队等着其他事情(”死等“,以及wait引起)
• TIMED_WAITING:这⼏个都表⽰排队等着其他事情(sleep,超时join引起)
• TERMINATED:⼯作完成了.

在这里插入图片描述

优先级

在操作系统中,线程有不同的优先级来控制它们的调度。优先级定义了线程在争夺CPU时间时的优先级顺序。通常,操作系统会按照优先级最高的线程先执行,然后是优先级次高的线程,以此类推,直到所有线程都执行完毕或者被暂停。

是否是后台进程

后台进程

不会阻止进程的结束

前台进程

会组止进程的结束

需要在调用start方法前调用setDaemon()方法设置是否为后台进程,
手动创建的线程都是前台进程

是否存活

JAVA代码中定义的线程对象的生命周期与内核中的pcb生命周期是不一样的

下面我们用一个代码演示一下

public class ThreadText3 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
            System.out.println("这个线程正在运行");
        });
        System.out.println(thread.isAlive());
        thread.start();
        System.out.println(thread.isAlive());
        thread.join();
        System.out.println(thread.isAlive());
    }
}

在这里插入图片描述

通过上述代码我们可以发现thread这个线程在创建前不在内核中存活和调用start方法后才在内核上创建pcb存活,等他执行结束后就不存活了

是否被中断

方法一:利用一个boolean类型变量

public class ThreadText3 {
    static boolean flag=false;
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
           while (!flag){
               System.out.println("线程正在运行");
               try {
                   sleep(1000);
               } catch (InterruptedException e) {
                   throw new RuntimeException(e);
               }
           }
        });
        thread.start();
        sleep(10000);
        flag=true;
        System.out.println("线程结束");
    }
}

方法二:利用Thread自带的api来操作

import static java.lang.Thread.sleep;

public class ThreadText4 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
            while (!Thread.currentThread().isInterrupted()){
                System.out.println("线程正在运行");

                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });
       thread.start();
       Thread.sleep(1000);
       //停止线程
       thread.interrupt();
        System.out.println("线程结束");

    }
}

在这里插入图片描述
上述代码执行完毕,发现不能停止线程,这是为什么呢?

这是因为如果interrupt()执行时,t线程正在sleep,那么interrupt()在将标志位设置为true后,又会直接将sleep强行唤醒。sleep在该程序中,占据了绝绝绝大部分的时间,因此当interrupt()执行时,几乎一定会遇到正在sleep的情况。注意:当sleep被提前唤醒的时候,sleep会自动把isInterrupted标志位再次清空(即把true又变为false)。这就导致了下次再判断循环条件,循环条件还成立,因此循环还在继续执行。
这么做的目的是为了让线程自身能够对于线程何时结束有一个更明确灵活的控制。

sleep为什么要清除标志位呢?

事实上,当前interrupt方法的效果并不是让线程立即结束,而是“通知建议”性质的,告诉线程“你该结束了”。至于线程是否真的要立即结束,都是可以通过代码来灵活控制的,否则就太僵硬了。interrupt只是通知,而不是命令。
比如有一天你正在打游戏,你的妈妈突然喊你去超市买酱油。这时你可以灵活选择:1、等一会儿再去;2、直接忽视;3、立马就去。代码也是一样:
在这里插入图片描述

等待线程

多线程的执行顺序是无序的(随机调度),但我们想通过一些方式让他有序怎么办

sleep

等待第一个线程结束后再执行第二个线程,首先我们要知道第一个线程执行多长时间,通常我们是不知道多长时间的,所以这个方法不常用
import static java.lang.Thread.sleep;

import static java.lang.Thread.sleep;

public class ThreadText4 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
            while (!Thread.currentThread().isInterrupted()){
                System.out.println("线程正在运行");

                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    break;
                }

            }
        });
       thread.start();
       Thread.sleep(1000);
       //停止线程
       thread.interrupt();
        System.out.println("线程结束");

    }
}

join

public class ThreadText4 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
                System.out.println("线程正在运行");
            }
        );
        thread.start();
        thread.join();
        System.out.println("线程结束");
    }
}

thread执行时main处于阻塞状态,等thread执行结束后才去cpu上参与调度,join通常用于多个线程并发执行主线程等待他们执行完毕,然后汇总

        今天的分享到这里就结束了,感谢大家支持

在这里插入图片描述

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

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

相关文章

竞赛云平台助力华东空管局远程知识竞赛

民航华东空管局“安康杯”第三届机关综合管理能力大赛采取远程线上方式进行,所有选手均不在同一个地方,不仅节省了成本,同时也大大简化了赛事组织工作。借助“赛易”这样的线上知识竞赛云平台,其实线上竞赛可以办得象线下一样高端…

Linux学习笔记 CenOS6.3 yum No package xxx available

环境CenOS [roothncuc ~]# cat /etc/issue CentOS release 6.2 (Final) Kernel \r on an \m安装gcc的时候提示没有包 [roothncuc ~]# sudo yum install gcc gcc-c libstdc-devel Loaded plugins: refresh-packagekit, security Setting up Install Process No package gcc a…

《PFL》论文阅读笔记

一、概要 随着联邦学习的发展,简单的聚合算法已经不在有效。但复杂的聚合算法使得联邦学习训练时间出现新的瓶颈。本文提出了并行联邦学习(parallel federated learning,PFL),通过调换中心节点聚合和广播的顺序。本文…

行业研究:2023年氟化钾发展前景及细分市场分析

氟化工产品,作为化工新材料之一,在“十二五”规划被单列一个专项规划。由于产品具有高性能、高附加值,氟化 工产业被称为黄金产业。 氟是一种盐,有一种叫做钾的腐化盐,这种产品是白色结晶,易吸收&#xff0…

基于Springboot的房产销售系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的房产销售系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Sp…

飞书全新版本搭载AI智能伙伴,支持用户自选底层大模型!

原创 | 文 BFT机器人 近日,字节跳动旗下飞书正式发布“飞书智能伙伴”系列AI产品。此次新产品有专属、易协作、有知识、有记忆、更主动等特点。除此之外,“飞书智能伙伴”作为一个开放的AI服务框架,各企业可根据业务场景自主选择适合的底层大…

图扑软件受邀出席高交会-全球清洁能源创新博览会

“相聚鹏城深圳,共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

从0开始学习JavaScript--JavaScript 工厂模式

JavaScript 工厂模式是一种强大的设计模式,它提供了一种灵活的方式来创建对象。本文将深入讨论工厂模式的基本概念、多种实现方式以及在实际应用中的各种场景。 工厂模式的基本概念 工厂模式旨在通过一个函数或方法来创建对象,而不是通过类直接实例化。…

使用Python脚本实现图片合成PDF功能

目录 一、所需库 二、图片合成PDF的实现过程 三、完整的代码示例 四、注意事项 总结 在Python中,我们可以使用一些强大的库来实现图片合成PDF的功能。这个过程主要包括读取图片文件、将图片按照指定的顺序合并以及生成PDF文件。下面,让我们一起探索…

用Metasploit进行信息收集2

基于FTP协议收集信息 1.查看ftp服务的版本信息 打开metasploit 查看ftp版本的模块,并进入模块 msf6 > search ftp_version msf6 > use auxiliary/scanner/ftp/ftp_version msf6 auxiliary(scanner/ftp/ftp_version) > show options 查看靶机的端口开方情…

switch....case击穿| return 和break的区别

1、我们首先要明白switch..case的语法使用: 执行流程:首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句…

C语言:用递归的方法求斐波那契数列:1,1,2,3,5,8,……的前40个数

分析&#xff1a; 首先&#xff0c;在代码的起始部分&#xff0c;包含<stdio.h>头文件&#xff0c;这个头文件提供了输入和输出的函数。 然后&#xff0c;定义了四个变量&#xff1a;f、f1、f2和i。f1和f2是斐波那契数列的前两个数字&#xff0c;初始化为1。f是当前计…

PyQt基础_011_对话框类控件QMessage

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class WinForm( QWidget): def __init__(self): super(WinForm,self).__init__() self.setWindowTitle("QMessageBox") self.resize(300, 100) self.myButt…

STM32通讯设计

STM32通讯设计 通讯流程STM32程序 通讯流程 1.使用HT2202芯片配置为主机接收&#xff08;轮询模式&#xff09;。 2.将STM32芯片配置为从机发送&#xff0c;中断模式下发送固定数据。 3.如果HT2202芯片能够收到STM32发送的数据则通讯成功&#xff0c;否则通讯失败。 STM32程序…

Vue性能优化方法

一、前言 1.1 为什么需要性能优化 用户体验&#xff1a;优化性能可以提升用户体验&#xff0c;降低加载时间和响应时间&#xff0c;让用户更快地看到页面内容。SEO优化&#xff1a;搜索引擎更喜欢快速响应的网站&#xff0c;优化性能可以提高网站的排名。节约成本&#xff1…

如何判断电脑电源质量的好坏?

电脑电源作为电脑的关键部件直接影响到电脑的性能和寿命&#xff0c;因此选择一个好的电源至关重要。那么要如何判断电脑电源的好坏呢?判断的指标都有哪些呢? 1.外观检测 观察电源外观可以初步判断电脑电源的工艺质量和材料质量。外观检测需要检查电源外壳是否坚固&#xff0…

视频监控平台EasyCVR多场景应用,AI视频分析技术助力行业升级转型

传统的视频监控系统建设&#xff0c;经常存在各方面的因素制约&#xff0c;造成管理机制不健全、统筹规划不到位、联网共享不规范&#xff0c;形成“信息孤岛”、“数据烟囱”。在监控系统的建设中缺乏统一规划&#xff0c;标准不统一、视频图像信息利用率低等问题日益突出。随…

uniapp如何与原生应用进行混合开发?

目录 前言 1.集成Uniapp 2.与原生应用进行通信 3.实现原生功能 4.使用原生UI组件 结论: 前言 随着移动应用市场的不断发展&#xff0c;使用原生开发的应用已经不能满足用户的需求&#xff0c;而混合开发成为了越来越流行的选择。其中&#xff0c;Uniapp作为一种跨平台的开…

【Python | 测试】assert 断言最佳实践

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

Linguistic Steganalysis in Few-Shot Scenario论文阅读笔记

TIFS期刊 A类期刊 新知识点 Introduction Linguistic Steganalysis in Few-Shot Scenario模型是个预训练方法。 评估了四种文本加密分析方法&#xff0c;TS-CSW、TS-RNN、Zou、SeSy&#xff0c;用于分析和训练的样本都由VAE-Stego生产(编码方式使用AC编码)。 实验是对比在少样…