线程结束的三种方式

2023-11-09

停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作。

在 Java 中有以下 3 种方法可以终止正在运行的线程:

  • 使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止。
  • 使用 stop() 方法强行终止线程,但是不推荐使用这个方法,该方法已被弃用。
  • 使用 interrupt 方法中断线程。

1.程序跑完退出(略)

2. 使用stop()退出线程

通过查看 JDK 的 API,我们会看到 java.lang.Thread 类型提供了一系列的方法如 start()、stop()、resume()、suspend()、destory()等方法来管理线程。但是除了 start() 之外,其它几个方法都被声名为已过时(deprecated)。

虽然 stop() 方法确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且该方法已被弃用,最好不要使用它。
JDK 文档中还引入用一篇文章来解释了弃用这些方法的原因:《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?》

为什么弃用stop:

  • 调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,包括在 catch 或 finally 语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
    调用 stop() 方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题。
    例如,存在一个对象 u 持有 ID 和 NAME 两个字段,假如写入线程在写对象的过程中,只完成了对 ID 的赋值,但没来得及为 NAME 赋值,就被 stop() 导致锁被释放,那么当读取线程得到锁之后再去读取对象 u 的 ID 和 Name 时,就会出现数据不一致的问题。

3.

  1. 使用 interrupt() 中断线程
    现在我们知道了使用 stop() 方式停止线程是非常不安全的方式,那么我们应该使用什么方法来停止线程呢?答案就是使用 interrupt() 方法来中断线程。

需要明确的一点的是:interrupt() 方法并不像在 for 循环语句中使用 break 语句那样干脆,马上就停止循环。调用 interrupt() 方法仅仅是在当前线程中打一个停止的标记,并不是真的停止线程。

也就是说,线程中断并不会立即终止线程,而是通知目标线程,有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。这一点很重要,如果中断后,线程立即无条件退出,那么我们又会遇到 stop() 方法的老问题。

事实上,如果一个线程不能被 interrupt,那么 stop 方法也不会起作用。

可以使用Thread.isInterrupt()来判断线程是否中断。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程结束的三种方式 的相关文章

  • CompletableFuture使用详解

    https blog csdn net admin123404 article details 111168902
  • ReentrantLock 源码分析

    ReentrantLock简单使用demo如下 Lock lock new ReentrantLock lock lock try 业务逻辑 finally lock unlock 注 获取的锁代码要放到try块之外 防止获得锁代码异常 抛
  • 云计算与Kubernetes(k8s)

    参考链接 https blog csdn net zkkzpp258 article details 86541362 https blog csdn net Bubbler 726 article details 85596418 htt
  • 多处理器架构

    多处理器架构是一种计算机体系结构 它具有多个处理器或中央处理单元 CPU 这些处理器可以同时处理多个任务和数据 多处理器架构可以大大提高计算机的性能和吞吐量 特别是在需要处理大量数据和高度并发的应用程序中 在现代计算机系统中 多处理器架构已
  • Java并发编程:线程池的使用

    https www cnblogs com dolphin0520 p 3932921 html Java并发编程 线程池的使用 在前面的文章中 我们使用线程的时候就去创建一个线程 这样实现起来非常简便 但是就会有一个问题 如果并发的线程数
  • 对于进程同步和异步的理解

    多进程并发执行具有异步的特性 进程异步就是指一个以上的进程在并发执行时具有的异步特型 就比如说两个进程之间指令的执行顺序是不确定的 具有很强的随机性 举个例子 现在有两个并发执行的进程 A 和 B 各自都有n条指令需要执行 然而 我的CPU
  • 请你说一下行级锁和表级锁的区别(或表级锁和行级锁的区别)

    本旨在学习记录 内容源自JavaGuide 作者在此基础上进行补充说明 整理论述 使其能以一种更为逻辑地清晰地方式表达出 请你说一下行级锁和表级锁的区别 的理解 更多适应于java面试回答 亦可作对请你说一下自己对行级锁和表级锁的简要了解
  • java 限流策略

    概要 在大数据量高并发访问时 经常会出现服务或接口面对暴涨的请求而不可用的情况 甚至引发连锁反映导致整个系统崩溃 此时你需要使用的技术手段之一就是限流 当请求达到一定的并发数或速率 就进行等待 排队 降级 拒绝服务等 在限流时 常见的两种算
  • Redisson分布式锁

    目录 一 分布式锁 1 分布式锁的设计原则 2 分布式锁的实现方案 二 Redisson 三 Redisson分布式锁 1 引入Redisson依赖 2 配置Redis 3 注入RedissonClient 4 使用RLock 总结 一 分
  • 并发编程专题06-java锁的深度化

    Java锁的深度化 下一篇 Disruptor框架 悲观锁 乐观锁 排他锁 重入锁 悲观锁与乐观锁 悲观锁 悲观锁悲观的认为每一次操作都会造成更新丢失问题 在每次查询时加上排他锁 每次去拿数据的时候都认为别人会修改 所以每次在拿数据的时候都
  • iOS并发编程(一)-简介

    一个菜鸟的自我修养 就是在低级职位上不抓狂 当一个优秀的菜鸟 就是为了有一天不当菜鸟 瞅准机会迅速脱离菜鸟轨道 然后一路飞翔到世界的尽头 接下来系统的学习下并发编程 会有几篇吧 不多说 走起 简介 1 异步设计方式 传统并发编程模型是线程
  • Java中synchronized同步锁用法及作用范围

    Java 中的 synchronized 关键字可以在多线程环境下用来作为线程安全的同步锁 本文主要对 synchronized 的作用 以及其有效范围进行讨论 Java中的对象锁和类锁 java的对象锁和类锁在锁的概念上基本上和内置锁是一
  • Qt基础之三十:百万级任务并发处理

    在实际的开发过程中 经常会遇到要处理大量任务场景 比如说压缩文件夹中的所有文件 对文件夹中的所有文件加密 上传文件夹中的所有文件到ftp等等 这里说百万级并不夸张 理论上文件夹中有任意多个文件都是可以的 本文以压缩文件夹中的100万张jpg
  • 无锁和偏向锁有什么区别?

    无锁和偏向锁是 Java 中的两种轻量级锁实现 它们和重量级锁相比 具有更高的性能和更低的开销 它们之间的区别如下 无锁 CAS 自旋锁 无锁是一种不需要使用锁的同步技术 它的实现依赖于 CAS Compare And Swap 操作 通过
  • LockSupport源码解析

    一 前言 LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础 它们底层其实都是依赖Unsafe实现 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语 LockSupport 提供park 和un
  • 多线程结合sprongboot事务(完善)

    避坑指南 1 Async Transactional不能在同一个方法上注解使用 原因Spring实现AOP的方法则就是利用了动态代理机制 正因如此 才会导致某些情况下 Async和 Transactional不生效 比如下面的将事务事务控制
  • 【并发】并发

    并发 进程和线程 进程 资源分配的基本单位 可以理解为在内存中运行的程序 每个进程都有独立的内存空间 一个进程包含多个线程 线程 任务执行的基本单位 负责进程中任务的执行 每个线程共享进程的内存空间 一个线程使用时 其他线程必须等待 用户
  • SSM实战项目——Java高并发秒杀API

    SSM实战项目 Java高并发秒杀API 项目截图 秒杀列表 秒杀详情页 错误提示 开始秒杀 秒杀成功 重复秒杀 秒杀倒计时 秒杀结束 项目介绍 何为秒杀 所谓 秒杀 就是网络卖家发布一些超低价格的商品 所有买家在同一时间网上抢购的一种销售
  • 如何为Kafka集群选择合适的Topic/Partitions数量

    这是许多kafka使用者经常会问到的一个问题 本文的目的是介绍与本问题相关的一些重要决策因素 并提供一些简单的计算公式 越多的分区可以提供更高的吞吐量 首先我们需要明白以下事实 在kafka中 单个patition是kafka并行操作的最小
  • Semaphore 源码分析

    需要提前了解的知识点 AbstractQueuedSynchronizer 实现原理 类介绍 Semaphore 信号量 是用来控制同时访问特定资源的线程数量 它通过协调各个线程 以保证合理的使用公共资源 比如控制用户的访问量 同一时刻只允

随机推荐

  • SPFA 算法模板

    SPFA 代替 Dijkstra 计算最短路 题目 题目链接 题解 SPFA 一般时间复杂度为 O m O m O m 最坏情况下为 O
  • CNN人脸识别项目(dlib+opencv)

    CNN人脸识别 获取数据集 读取数据集 数据预处理 建立模型进行预训练 对图片进行人脸进行检测并进行可视化 总结 思路 一个CNN人脸识别项目首先必不可少的是数据集 获取的方式有网站数据库 PubFig Public Figures Fac
  • ORACLE查询删除重复记录三种方法

    比如现在有一人员表 表名 peosons 若想将姓名 身份证号 住址这三个字段完全相同的记录查询出来 复制代码代码如下 select p1 from persons p1 persons p2 where p1 id lt gt p2 id
  • 如何实现Java的JDBC编程(基本概念,驱动包安装)

    Java的JDBC编程 这里写目录标题 Java的JDBC编程 1 概念 2 安装驱动包 3 实现JDBC编程 1 概念 何为 JDBC编程 就是通过Java代码来操作数据库 咱们学数据库 无论是命令行 还是图形化界面 都不是开发中的主流使
  • 测试工作中一定要学会做业务总结

    前言 在日常的测试工作中 不知道大家是否会有梳理自己测试业务的习惯 我个人觉得这个事情是值得做的 最好培养成一个习惯 另外一定要依托于业务价值来实现自己的变现 梳理被测业务 就是一种很好的自我提升方式 测试工作中一定要学会业务总结 一 为什
  • JavaWeb之xml学习笔记一(约束初步使用)

    html和xml的不同点 元素和属性 html中的元素和属性都是预先设定的 而xml中没有预想设定的元素和属性 xml是可扩张的标记语言 标记可以用户自定义元素和属性 使用目的 html使用来显示界面的 注重的是外观和功能 而xml是用来传
  • Feign远程调用 请求头丢失问题及解决方案

    问题描述 在微服务项目中 通过Feign远程调用另一个模块的接口 由于请求头没传过去导致接口调用失败 解决办法 feign调用远程接口时 会扫描所有的拦截器 执行apply方法 我们可以创建一个拦截器放到spring容器中 在拦截器里把原来
  • module ‘scipy.misc‘ has no attribute ‘imresize‘

    报错 AttributeError module scipy misc has no attribute imresize 解决方法 使用skimage库 conda install scikit image 注意 scipy misc i
  • 第十六章PHY -基于Linux3.10

    下载地址 http download csdn net detail shichaog 8620701 16 1 PHY 本章和OSI模型中的物理层和数据链路层关系密切 在嵌入式SOC上 通常集成有ARM核和MAC控制器 以及增加数据传输带
  • 信噪比和信干噪比

    1 信噪比 即香农公式 信道容量公式 中的S N C B log 2
  • java和javascript区别_java和javascript之间有什么区别

    java和javascript之间有什么区别 本篇文章就给大家介绍java和javascript之间的区别 让大家了解java和javascript是什么 它们之间的差异有哪些 有一定的参考价值 有需要的朋友可以参考一下 希望对你们有所帮助
  • 数据库实验——数据表的导入导出

    管理数据表 创建表的目在于利用表进行数据的存储和管理 对数据进行管理的前提是数据的存储 向表中添加数据 没有数据的表是没有任何实际意义的 添加完成后 用户也可以根据自己的需要对表中数据进行修改和删除 在SQL Server 2008中 对于
  • PowerDesigner显示汉字表名和英文表名

    菜单 gt Tool gt Model Options gt Name Convention gt 右侧display中选择显示name还是code 不支持同时显示 但可以选择显示code 然后将name填入stereotype中 变相同时
  • torchtext建立词表build_vocab()时使用自己的word2vec模型

    代码如下 如果对于torchtext本身不太了解 可以参考 torchtext处理文本数据 构造dataset读取文本 学习一 torchtext处理文本数据 构造dataset读取文本 学习一 from torchtext import
  • Java运行机制及运行过程

    Java核心机制 Java虚拟机 JVM Java Virtual Machine JVM是一个虚拟的计算机 具有指令集并使用不同的存储区域 负责执行指令 管理数据 内存 寄存器 包含在JDK中 对于不同的平台 有不同的虚拟机 Java虚拟
  • Java开发必学!kafka从入门到精通

    四面阿里 面试岗位是研发工程师 直接找蚂蚁金服的大佬进行内推 参与了阿里巴巴中间件部门的提前批面试 一共经历了四次面试 拿到了口头offer 一面 自我介绍 项目中做了什么 难点呢 Java的线程池说一下 各个参数的作用 如何进行的 Red
  • Could NOT find CUDNN: Found unsuitable version “..“, but required is at least “6“

    现象 在编译cuda版本的opencv4 1时 使用cmake配置时找不到cudnn 实际已安装 原因 由于安装的cudnn版本为8 2 原先记录cudnn版本的宏定义 CUDNN MAJOR和CUDNN MINOR 由cudnn h 移动
  • python--数据分析pandas

    1 pandas概述 Pandas是进行科学数据分析中另一个比较常用的数据库 基于NumPy 但加入了更多的高级数据结构以及操作工具 进一步简化了NumPy等运算与应用 1 1安装 pip install pandas 可以通过import
  • mysql主备 jdbc链接_mysql8 参考手册-使用JDBC配置连接的服务器故障转移

    MySQL Connecto J支持服务器故障转移 当基础活动连接发生与连接有关的错误时 将发生故障转移 连接错误 默认情况下 传递给客户端 其中有通过处理它们 例如 重新创建工作对象 Statement ResultSet 等 并重新启动
  • 线程结束的三种方式

    停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作 也就是放弃当前的操作 在 Java 中有以下 3 种方法可以终止正在运行的线程 使用退出标志 使线程正常退出 也就是当 run 方法完成后线程中止 使用 stop 方法强行终止线