当前位置: 首页 > news >正文

深入理解高并发编程 - Thread 类的 stop () 和 interrupt ()

stop()

stop() 方法被用于停止线程。然而,需要注意的是,stop() 方法已经被标记为已废弃(deprecated),并且不推荐使用。这是因为使用该方法可能导致不可预料的问题和数据不一致性,因此它被认为是不安全的。

当调用 stop() 方法来终止一个线程时,它会立即停止线程的执行,无论线程是否在一个安全的状态下。这可能导致线程被终止时,它正在执行一些重要的操作,如写入文件、更新数据等,导致数据损坏或不一致。

如果线程持有 ReentrantLock 锁,被 stop()的线程并不会自动调用 ReentrantLock 的 unlock()去释放锁,那其他线程就再也没机会获得 ReentrantLock 锁, 这样其他线程就再也不能执行 ReentrantLock 锁锁住的代码逻辑。 所以该方法就不建议使用了, 类似的方法还有 suspend()和resume()方法。

public class UnsafeStopExample {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {while (true) {System.out.println("Thread is running...");}});thread.start();Thread.sleep(1000); // 让线程运行一会儿thread.stop(); // 使用不安全的 stop() 方法终止线程}
}

在这个例子中,线程在一个无限循环内部执行,打印一条消息。主线程启动了这个线程,然后经过一秒后,使用 stop() 方法终止了它。这看起来似乎没有问题,但实际上,这个方法存在潜在的风险。

当调用 stop() 方法终止线程时,线程可能会在任何地方被停止,甚至可能在一条语句的中间。这可能导致线程被终止时,它正在进行一些重要的操作,如更新数据、释放资源等。这可能会使系统处于不一致的状态。

此外,如果线程在使用锁、I/O 操作或其他资源时被 stop() 终止,这些资源可能会被线程占用,而没有正确释放,从而导致资源泄漏。

综上所述,stop() 方法的使用是不安全的,因为它可能在不可预测的时刻终止线程,从而导致数据损坏、资源泄漏以及系统不一致的情况。因此,推荐使用其他更安全和可控的方法来终止线程,比如让线程自己处理中断请求。

interrupt ()

interrupt() 方法是用于中断线程的方法。它并不会直接终止线程,而是向目标线程发送一个中断请求,然后由目标线程自行处理中断。这样做的好处是可以更安全地终止线程,允许线程在适当的时机进行清理操作。

当调用一个线程的 interrupt() 方法时,有两种可能的情况:

如果线程处于阻塞状态(如调用了 sleep()、wait()、join() 等方法),那么它将收到一个 InterruptedException 异常,并且中断状态会被清除(即调用 isInterrupted() 会返回 false)。如果线程没有被阻塞,中断状态会被设置(即调用 isInterrupted() 会返回 true),线程可以在合适的时机检查中断状态,并根据情况决定是否继续执行。

当一个线程调用 interrupt() 方法时,它实际上是向目标线程发送一个中断请求,目标线程可以根据中断状态来决定如何处理这个请求。下面是一个使用 interrupt() 方法的示例,说明为什么它是一种更安全的线程终止方式:

public class InterruptExample {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {while (!Thread.currentThread().isInterrupted()) {System.out.println("Thread is running...");try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 重新设置中断状态System.out.println("Thread interrupted while sleeping.");}}});thread.start();Thread.sleep(5000); // 让线程运行一会儿thread.interrupt(); // 使用 interrupt() 方法请求中断线程}
}

在这个示例中,线程在一个循环内部执行,并在每次循环中检查中断状态。如果中断状态被设置(通过调用 interrupt() 方法),则线程会在适当的时机停止循环并退出线程。

另外,注意到在线程内部的 try-catch 块中,当线程在执行 Thread.sleep() 时,如果被中断,会捕获 InterruptedException 异常。在这里,我们重新设置了线程的中断状态,以便在后续的循环迭代中,线程可以检查中断状态并正确地终止。

这种使用 interrupt() 方法的方式更安全,因为它遵循了线程自行决定是否终止的原则,同时也可以保证在终止前进行清理操作(例如,释放锁、关闭资源等)。相对于直接调用 stop() 方法,这种方式更适合处理线程的安全终止。

相关文章:

深入理解高并发编程 - Thread 类的 stop () 和 interrupt ()

stop() stop() 方法被用于停止线程。然而,需要注意的是,stop() 方法已经被标记为已废弃(deprecated),并且不推荐使用。这是因为使用该方法可能导致不可预料的问题和数据不一致性,因此它被认为是不安全的。…...

C语言之三子棋游戏实现篇

目录 主函数test.c 菜单函数 选择实现 游戏函数 (函数调用) 打印棋盘数据 打印展示棋盘 玩家下棋 电脑下棋 判断输赢 循环 test.c总代码 头文件&函数声明game.h 头文件的包含 游戏符号声明 游戏函数声明 game.h总代码 游戏函数ga…...

jupyter notebook 插件nbextensions的安装

安装步骤: 1、打开 jupyter notebook,新建一个 python 文件; 2、 分别输入以下代码,然后运行,出现 warning 不影响使用,如果出现 errors,则说明下载有问题: !python -m pip install…...

Spring boot 集成单元测试

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency> 2. 3.编写测试类 package com.enterprise;import com.enterpr…...

基于C++的QT实现贪吃蛇小游戏

文章目录&#xff1a; 一&#xff1a;效果演示 二&#xff1a;实现思路 三&#xff1a;代码实现 widget.h widget.cpp main.cpp 一&#xff1a;效果演示 效果图◕‿◕✌✌✌ 代码下载 二&#xff1a;实现思路 通过按键控制蛇的移动&#xff0c;每吃一个商品蛇身就会加长…...

Spring Boot整合RabbitMQ之路由模式(Direct)

RabbitMQ中的路由模式&#xff08;Direct模式&#xff09;应该是在实际工作中运用的比较多的一种模式了&#xff0c;这个模式和发布与订阅模式的区别在于路由模式需要有一个routingKey&#xff0c;在配置上&#xff0c;交换机类型需要注入DirectExchange类型的交换机bean对象。…...

行式存储与列式存储

1.概述 数据处理大致可分为两大类&#xff0c;联机事务处理OLTP(on-line transaction processing) 和联机分析处理OLAP(on-line analytical processing)。 OLTP是传统关系型数据库的主要应用&#xff0c;用来执行一些基本的、日常的事务处理&#xff0c;比如数据库记录的增、删…...

windows上sqlserver的ldf日志文件和数据mdf文件分别放到不同的磁盘

之前我的windows上已安装好了sqlserver2017&#xff0c;有一个名为TestDb的数据库。ldf文件和mdf文件都一起放在D:\Database目录下。现在需要把ldf日志文件到E盘的database目录下。 重要的事情先说三遍 先停止网关&#xff08;例如nginx&#xff09;并备份数据库 先停止网关&am…...

vue3+uni——watch监听props中的数据(组件参数接收与传递defineProps、defineEmits)

案例说明 A页面引用的子组件B A页面 <template><view>//引用组件<serviceOrder change"change" :list"list" :current"type"></serviceOrder></view> </template><script setup>import serviceOrd…...

mybatis与spring集成与spring aop集成pagehelper插件

Mybatis与Spring的集成 Mybatis是一款轻量级的ORM框架&#xff0c;而Spring是一个全栈式的框架&#xff0c;二者的结合可以让我们更加高效地进行数据持久化操作。 Mybatis与Spring的集成主要有两种方式&#xff1a;使用Spring的Mybatis支持和使用Mybatis的Spring支持。 使用…...

Mybatis基础

...

TypeScript-- 配置Typescript环境(1)ts 转js,tsc --watch 实时编译

文章目录 安装Typescript判断是否有运行权限编写第一Typescript文件手动编译Ts文件转Js文件实时编译 安装Typescript npm install -g typescript 判断是否有运行权限 命令行运行 tsc -v 遇到了权限问题 用管理员打开window自带的powershell 运行如下指令即可&#xff1a; Set-…...

Dockerfile快速搭建自己专属的LAMP环境,生成镜像lamp:v1.1,并推送到私有仓库

环境&#xff1a; CentOS 7 Linux 3.10.0-1160.el7.x86_64 具体要求如下&#xff1a; &#xff08;1&#xff09;基于centos:6基础镜像&#xff1b; &#xff08;2&#xff09;指定作者信息&#xff1b; &#xff08;3&#xff09;安装httpd、mysql、mysql-server、php、ph…...

Lottery抽奖项目学习第二章第一节:环境、配置、规范

Lottery抽奖项目学习第二章第一节&#xff1a;环境、配置、规范 环境、配置、规范 下面以DDD架构和设计模式落地实战的方式&#xff0c;进行讲解和实现分布式抽奖系统的代码开发&#xff0c;那么这里会涉及到很多DDD的设计思路和设计模式应用&#xff0c;以及互联网大厂开发中…...

OpenCV之reshape函数

函数原型&#xff1a; /** brief Changes the shape and/or the number of channels of a 2D matrix without copying the data.The method makes a new matrix header for \*this elements. The new matrix may have a different sizeand/or different number of channels. A…...

【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制

【JavaEE】Spring事务&#xff08;2&#xff09; 文章目录 【JavaEE】Spring事务&#xff08;2&#xff09;1. Transactional 参数介绍1.1 value 和 transactionManager1.2 timeout1.3 readOnly1.4 后面四个1.5 isolation 与 propagation 2. Spring 事务隔离级别 - isolation2.…...

微信小程序canvas type=2d生成海报保存到相册、文字换行溢出显示...、文字删除线、分享面板

一、简介 做个简单的生成二维码海报分享&#xff0c;我做的时候也找简单的方法看能不能实现页面直接截图那种生成图片&#xff0c;原生小程序不支持&#xff0c;不多介绍下面有全部代码有注释、参数自行替换运行看看&#xff0c;还有需要优化的地方&#xff0c;有问题可以咨询…...

C++卷积神经网络

C卷积神经网络 #include"TP_NNW.h" #include<iostream> #pragma warning(disable:4996) using namespace std; using namespace mnist;float* SGD(Weight* W1, Weight& W5, Weight& Wo, float** X) {Vector2 ve(28, 28);float* temp new float[10];V…...

go 读取yaml映射到struct

安装 go get gopkg.in/yaml.v3创建yaml Mysql:Host: 192.168.214.134Port: 3306UserName: wwPassword: wwDatabase: go_dbCharset: utf8mb4ParseTime: trueLoc: LocalListValue:- haha- test- vv JWTSecret: nidaye定义结构体 type Mysql struct {Host string yaml:&…...

Redis 10 大数据类型

1. which 10 1. redis字符串 2. redis 列表 3. redis哈希表 4. redis集合 5. redis有序集合 6. redis地理空间 7. redis基数统计 8. redis位图 9. redis位域 10. redis流 2. 获取redis常见操作指令 官网英文&#xff1a;https://redis.io/commands 官网中文&#xff1a;https:/…...

优化生产流程:数字化工厂中的OPC UA分布式IO模块应用

背景 近年来&#xff0c;为了提升在全球范围内的竞争力&#xff0c;制造企业希望自己工厂的机器之间协同性更强&#xff0c;自动化设备采集到的数据能够发挥更大的价值&#xff0c;越来越多的传统型工业制造企业开始加入数字化工厂建设的行列&#xff0c;实现智能制造。 数字化…...

Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

一、前言 不同于之前的term。terms等结构化查询&#xff0c;全文搜索首先对查询词进行分析&#xff0c;然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据&#xff08;text类型&#xff09;,默认的数据形式是人类的自然语言&#xff0c;如对话内容、图书名…...

已解决Gradle错误:“Unable to load class ‘org.gradle.api.plugins.MavenPlugin‘”

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

windows中安装sqlite

1. 下载文件 官网下载地址&#xff1a;https://www.sqlite.org/download.html 下载sqlite-dll-win64-x64-3430000.zip和sqlite-tools-win32-x86-3430000.zip文件&#xff08;32位系统下载sqlite-dll-win32-x86-3430000.zip&#xff09;。 2. 安装过程 解压文件 解压上一步…...

前端面试:【系统设计与架构】前端架构模式的演进

前端架构模式在现代Web开发中扮演着关键角色&#xff0c;它们帮助我们组织和管理前端应用的复杂性。本文将介绍一些常见的前端架构模式&#xff0c;包括MVC、MVVM、Flux和Redux&#xff0c;以及它们的演进和应用。 1. MVC&#xff08;Model-View-Controller&#xff09;&#x…...

【CSS】em单位的理解

1、em单位的定义 MDN的解释&#xff1a;它是相对于父元素的字体大小的一个单位。 例如&#xff1a;父元素font-size&#xff1a;16px&#xff1b;子元素的font-size&#xff1a;2em&#xff08;也就是32px&#xff09; 注&#xff1a;有一个误区&#xff0c;虽然他是一个相对…...

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html...

【滑动窗口】leetcode209:长度最小的子数组

一.题目描述 长度最小的子数组 二.思路分析 题目要求&#xff1a;找出长度最小的符合要求的连续子数组&#xff0c;这个要求就是子数组的元素之和大于等于target。 如何确定一个连续的子数组&#xff1f;确定它的左右边界即可。如此一来&#xff0c;我们最先想到的就是暴力枚…...

C++ STL unordered_map

map hashmap 文章目录 Map、HashMap概念map、hashmap 的区别引用头文件初始化赋值unordered_map 自定义键值类型unordered_map 的 value 自定义数据类型遍历常用方法插入查找 key修改 value删除元素清空元素 unordered_map 中每一个元素都是一个 key-value 对&#xff0c;数据…...

全流程R语言Meta分析核心技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…...

大连筑成建设集团有限公司网站/推广策略可以分为哪三种

最近Android 6.0版本的源代码开放下载&#xff0c;刚好分析Android源码的技术书籍《Android源码设计模式解析与实战》上市&#xff0c;我们邀请到它的作者何红辉&#xff0c;来谈谈Android源码中的设计模式&#xff0c;以及近期Android开发中的一些热点话题。\\受访嘉宾介绍&am…...

直接在wordpress官网写博客/江苏seo技术教程

题目描述 输入一个整数n&#xff08;n>1&#xff09;&#xff0c;判断其是否为素数。素数的定义为&#xff1a;一个大于1的整数&#xff0c;如果除了1和其自身以外没有其他正因子&#xff0c;则称此数为素数或质数。输入要求 输入一个整数n(n>1)。输出要求 如果该数是…...

做欧洲电商看哪个网站吗/如何宣传推广自己的产品

最近使用云服务器&#xff0c;学习一下Docker&#xff0c;今天学着使用Docker安装MySQL。首先&#xff0c;从阿里云的Docker Hub 上pull一个MySQL的image.[CentOSlinuxidc~]$ docker pull registry.cn-hangzhou.aliyuncs.com/acs-sample/mysql:5.75.7: Pulling from acs-sample…...

做我姓什么的网站/沈阳百度推广排名优化

一、MySQL数据库的特点&#xff1a;1、MySQL是关系型数据库管理系统2、体积小&#xff0c;灵活性强&#xff0c;速度快3、源码开放&#xff0c;成本低&#xff0c;可移植性强二、与oracle数据库的区别1、数值类型不同a)整数类型包括&#xff1a;smallint(2字节)&#xff0c;int…...

用java可以做网站吗/北京网站建设公司

LEN() 函数 LEN() 函数返回文本字段中值的长度。 SQL LEN() 语法 SELECT LEN(column_name) FROM table_name; MySQL 中函数为 LENGTH(): SELECT LENGTH(column_name) FROM table_name; 演示数据库 在本教程中&#xff0c;我们将使用 RUNOOB 样本数据库。 下面是选自 "Webs…...

seo外贸网站制作/百度客服中心人工电话

近期有一个项目设计一个APP实现通过触摸屏实现毛笔写字效果。传统的绘画板程序直接通过Path的moveTo和LineTo便可实现简单的线条绘画程序。然而要达到毛笔的笔锋效果则须要更为具体点的设计。我的实现思路是通过以触摸事件DOWN、MOVE、UP中的每个点为圆心画圆&#xff0c;除此之…...