20240427-线程基础-结束线程

线程基础-结束线程

1.stop()方法

2.使用共享变量

package com.ysf.day0427;public class Tst03ShareVar {static volatile boolean flag = true;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while (flag){//处理业务}System.out.println("任务结束");},"share-1");t.start();Thread.sleep(1000L);flag = false;}
}

3.使用interrupt

3.1 interrupt标记位

  • 线程中存在一个标记位interrupt,来标识线程是否被打断
  • 该标记位默认情况下是false

3.2 查询线程标记位

  • 对象方法:isInterrupted()
package com.ysf.day0427;public class Tst04QueryInterrupt {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{for (int i = 0;i<5;i++){System.out.println(i);try {Thread.sleep(500L);} catch (InterruptedException e) {e.printStackTrace();}}},"interrupt-1");t1.start();Thread.sleep(1000L);System.out.println(t1.isInterrupted());}
}

3.3设置线程interrupt标记位为true

  • 对象方法:interrupt()
  • 作用:
    • 改变标记位为true
    • 打断线程的WAITING或者TIMED_WAITING状态
  • 用法:
    • 当用作设置线程结束的方法时(没有sleep,没有wait),标记位会有明显改变
    • 当作为打断线程WAITING或者TIMED_WAITING状态的方法时,线程的标记位是不会被改变的
package com.ysf.day0427;import java.util.Date;public class Tst05SetInterrupt {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{int count = 0;while (!Thread.currentThread().isInterrupted()){System.out.println("业务处理" + count);count++;// 这里用于证明,在调用了interrupt()方法后,并没有改变线程的标记位System.out.println(Thread.currentThread().isInterrupted());try {System.out.println("开始睡眠");// 睡眠50秒,方便被main线程打断,可以清晰的看出线程并没有睡足50秒Thread.sleep(50000L);} catch (InterruptedException e) {// 当捕获到这个异常的时候会有两种情况// 情况1:我只想打断沉睡// 情况2:我想退出线程if (count<20){// 模拟情况1,如果count小于20的话,那我只想打断沉睡continue;}else {// 模拟情况2,如果count不小于20的话,那我想退出线程// 这里我们不用break或return,我们使用改变标记位的方式// 为什么这里还要再打断一次,因为main线程的打断只是改变了线程WAITING状态,并没有改变标记位Thread.currentThread().interrupt();}}}System.out.println("线程结束");},"interrupt-1");t1.start();// 睡一秒,等待t线程启动Thread.sleep(1000L);for (int i = 0;i<21;i++){Thread.sleep(1000L);t1.interrupt();}}
}

3.3查询线程标记位,并将标记位设置为false

  • 静态方法:Thread.interrupted()
  • 作用:
    查询线程的标记位,并且将标记位设置为false
package com.ysf.day0427;public class Tst06SetInterruptFalse {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{int count = 0;String name = Thread.currentThread().getName();while (!Thread.currentThread().isInterrupted()){System.out.println(name + "==>" + count);count++;// 这里用于证明,在调用了interrupt()方法后,并没有改变线程的标记位System.out.println(Thread.currentThread().isInterrupted());try {System.out.println(name + "==>" + "开始睡眠");// 睡眠50秒,方便被main线程打断Thread.sleep(50000L);} catch (InterruptedException e) {// 当捕获到这个异常的时候会有两种情况// 情况1:我只想打断沉睡// 情况2:我想退出线程if (count<3){// 模拟情况1,如果count小于3的话,那我只想打断沉睡continue;}else {// 模拟情况2,如果count不小于3的话,那我想退出线程// 这里我们不用break或return,我们使用改变标记位的方式// 为什么这里还要再打断一次,因为main线程的打断只是改变了线程WAITING状态,并没有改变标记位System.out.println(name + "==>" + "count不小于3了");Thread.currentThread().interrupt();// 那如果我在调用了打断之后,我又有其他情况不想退出了呢?// 我们可以在此基础上再调用一次静态方法System.out.println(name + "==>" + Thread.interrupted());}}}System.out.println(name + "==>" + "线程结束");},"interrupt-1");t1.start();// 睡一秒,等待t线程启动Thread.sleep(1000L);for (int i = 0;i<3;i++){String name = Thread.currentThread().getName();Thread.sleep(1000L);System.out.println(name + "==>" + "开始执行第" + i + "次打断");t1.interrupt();}}
}

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

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

相关文章

读天才与算法:人脑与AI的数学思维笔记14_人脑的极限

1. 数学研究 1.1. 数学研究变得更为艰难了 1.1.1. 学科分支越发密集&#xff0c;问题越发复杂 1.1.2. 攻读博士学位的3年时间&#xff0c;只够去理解导师所给题目的含义 1.1.3. 随后&#xff0c;再花费数年时间去研究、探索&#xff0c;运气不错的话&#xff0c;会得到一些…

CVE-2022-2602:unix_gc 错误释放 io_uring 注册的文件从而导致的 file UAF

前言 复现该漏洞只是为了学习相关知识&#xff0c;在这里仅仅做简单记录下 exp&#xff0c;关于漏洞的详细内容请参考其他文章&#xff0c;最后在 v5.18.19 内核版本上复现成功&#xff0c;v6.0.2 复现失败 漏洞利用 diff --git a/include/linux/skbuff.h b/include/linux/s…

10GMAC层设计系列-(1)10G Ethernet PCS/PMA

一、引言 对于10G以太网MAC层的实现&#xff0c;Xilinx提供了 3种IP核&#xff0c;分别是 10G Ethernet MAC、10G Ethernet PCS/PMA、10G Ethernet Subsystem。 10G Ethernet MAC只包含MAC层&#xff0c;外部需要提供一个PHY芯片进行数据对齐&#xff0c;10G Ethernet MAC与P…

软考 系统架构设计师系列知识点之软件可靠性基础知识(7)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件可靠性基础知识&#xff08;6&#xff09; 所属章节&#xff1a; 第9章. 软件可靠性基础知识 第1节 软件可靠性基本概念 9.1.5 广义的可靠性测试和狭义的可靠性测试 广义软件可靠性测试 广义的软件可靠性测试是…

sql注入工具-​sqlmap

介绍&#xff1a; sqlmap是一款开源的自动化SQL注入工具&#xff0c;用于自动化检测和利用Web应用程序中的SQL注入漏洞。它具有强大的参数化查询和自定义注入脚本的功能&#xff0c;可以通过检测和利用SQL注入漏洞来获取数据库的敏感信息&#xff0c;如用户名、密码和其他重要…

C++ | Leetcode C++题解之第60题排列序列

题目&#xff1a; 题解&#xff1a; class Solution { public:string getPermutation(int n, int k) {vector<int> factorial(n);factorial[0] 1;for (int i 1; i < n; i) {factorial[i] factorial[i - 1] * i;}--k;string ans;vector<int> valid(n 1, 1);…

gateway全局token过滤器

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>创建一个tokenFilter 实现全局过滤器GlobalFilter,并且实现fitler方法 Value("${…

Python内置函数issubclass()详解

在Python中&#xff0c;issubclass()函数是一个用于检查一个类是否是另一个类的子类的内置函数。这个函数在处理类的继承关系时非常有用。 函数定义 issubclass()函数的基本语法如下&#xff1a; issubclass(class, classinfo)class&#xff1a;要检查的类。classinfo&#…

WebGL/Cesium 大空间相机抖动 RTE(Relative to Eye)实现原理简析

在浏览器中渲染大尺寸 3D 模型&#xff1a;Speckle 处理空间抖动的方法 WebGL/Cesium 大空间相机抖动 RTE(Relative to Eye)实现原理简析 注: 相机空间和视图空间 概念等效混用 1、实现的关键代码 const material new THREE.RawShaderMaterial({uniforms: {cameraPostion: {…

使用hutool工具导入excel Java

Hutool是一个Java工具类库&#xff0c;它提供了一系列实用的API&#xff0c;包括操作Excel的功能。要使用Hutool导入Excel&#xff0c;你可以使用ExcelReader类。以下是一个简单的例子&#xff0c;展示了如何使用Hutool导入Excel文件&#xff1a; import cn.hutool.poi.excel.…

【全开源】Java上门老人护理老人上门服务类型系统小程序APP源码

功能&#xff1a; 服务分类与选择&#xff1a;系统提供详细的老人护理服务分类&#xff0c;包括日常照护、康复训练、医疗护理等&#xff0c;用户可以根据老人的需求选择合适的服务项目。预约与订单管理&#xff1a;用户可以通过系统预约护理服务&#xff0c;并查看订单详情&a…

final原理

文章目录 1. 设置 final 变量的原理2. 获取 final 变量的原理 1. 设置 final 变量的原理 理解了 volatile 原理&#xff0c;再对比 final 的实现就比较简单了 public class TestFinal {final int a 20; }字节码 0: aload_0 1: invokespecial #1 // Method java/lang/Object…

Linux:使用ssl加密网站为https

Linux&#xff1a;使用ssl加密网站为https 生成对应的数字证书以及密钥 [rootserver100 ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/nginx/certs/timinglee.org.key -x509 -days 365 -out /etc/nginx/certs/timinglee.org.crt......*...................…

Python进阶之-traceback详解

✨前言&#xff1a; 在日常开发中&#xff0c;我们会做一些基本的异常处理&#xff0c;但是有时候只能打印我们处理的结果或者将异常打印出来&#xff0c;不能直观的知道在哪个文件中的哪一行出错。在Python中&#xff0c;traceback是一个用来跟踪异常错误信息的标准库&#x…

无人机证书的含金量

无人机证书的含金量主要取决于以下几个因素&#xff1a; 1. 颁发机构&#xff1a;不同的机构颁发的无人机证书可能有不同的认可度。一些知名的无人机制造商、行业协会或政府机构颁发的证书通常具有较高的含金量&#xff0c;因为这些机构通常具备较高的权威性和专业性。 2. 培…

Docker搭建LNMP+Wordpress

一.项目模拟 1.项目环境 公司在实际的生产环境中&#xff0c;需要使用 Docker 技术在一台主机上创建 LNMP 服务并运行 Wordpress 网站平台。然后对此服务进行相关的性能调优和管理工作。 安装包下载&#xff1a; wget http://101.34.22.188/lnmp_wordpress/mysql-boost-5.7…

【Jenkins】持续集成与交付 (十):Tomcat 8.5.99 安装和配置详解

🟣【Jenkins】持续集成与交付 (十):Tomcat 8.5.99 安装和配置详解 一、安装 Tomcat 8.5.991.1 上传 Tomcat 压缩包1.2 安装 JDK(如果尚未安装)1.3 解压 Tomcat 压缩包1.4 创建目标目录并移动 Tomcat 文件1.5 启动 Tomcat二、配置 Tomcat 用户角色权限2.1 添加用户及权限…

数论-整除

点个关注吧&#xff0c;谢谢&#xff01; 后面将继续更新数论基础&#xff0c;如果内容有问题&#xff0c;请私信我。 定义&#xff1a; 设 a , b ∈ Z a,b\in \mathbb{Z} a,b∈Z&#xff0c;如果存在整数 c ∈ Z c \in \mathbb{Z} c∈Z&#xff0c;使得 b a c bac bac&#x…

记录k8s以docker方式安装Kuboard v3 过程

原本是想通过在k8s集群中安装kuboad v3的方式安装kuboard&#xff0c;无奈在安装过程中遇到了太多的问题&#xff0c;最后选择了直接采用docker安装的方式&#xff0c;后续有时间会补上直接采用k8s安装kuboard v3的教程。 1.kuboard安装文档地址&#xff1a; 安装 Kuboard v3 …

【机器学习】视觉基础模型的三维意识:前沿探索与局限

视觉基础模型的三维意识&#xff1a;前沿探索与局限 一、引言二、视觉基础模型的三维意识三、当前模型的局限性四、实验与结果五、总结与展望 大规模预训练的进展已经产生了具有强大能力的视觉基础模型。最近的模型不仅可以推广到任意图像的训练任务&#xff0c;而且它们的中间…