Java 终止线程的几种方式

2023-11-16

一、正常运行结束

所谓正常运行结束,就是程序正常运行结束,线程自动结束。

public class ThreadTest extends Thread {  
	public void run() {  
		//do something  
	} 
} 

二、使用退出标志退出线程

一般run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。他们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如:最直接的方法就是设一个boolean类型的标志,并通过设置这个标志位true或false来控制while循环是否退出,下面放代码:

public class ThreadTest extends Thread {  
	public volatile boolean exit = false;  
	public void run() {  
		while (!exit){  
			//do something  
		}  
	} 
} 

三、interrupt方法结束线程

使用interrupt()方法来中断线程是分两种情况的:

  • 线程处于阻塞状态:如使用了sleep(),同步锁的wait(),socket中的receiver(),accept()等方法时,会使线程处于阻塞状态。当调用线程interrupt()方法时,会抛出InterruptException异常。阻塞中的那个方法抛出此异常,通过代码可以捕获此异常,然后跳出循环状态,从而让我们有机会结束这个线程的执行。并不是只要调用interrupt()方法,线程就会结束,实际上是不正确的,一定要先捕获InterruptException异常之后通过break来跳出循环,才能正常结束run()方法。
  • 线程未处于阻塞状态:使用isInterrupted()判断线程的中断标志来退出循环。当使用interrupt()方法时,中断标志就会为true,和使用自定义的标志来控制循环是一样的道理。
public class ThreadTest extends Thread {
	public void run() {
		while(!isInterrupted()) {
			try {
				Thread.sleep(5*1000);
			} catch(InterruptedException e) {
				e.printStackTrace();
				break;//捕获到异常之后,执行break跳出循环
			}
		}
	}
}

四、stop()方法终止线程(不安全)

我们可以直接使用thread.stop()来强行终止线程,但是stop()方法是很危险的,就想突然关闭电源一样。这样子可能机会产生不可预料的结果,不安全主要是:

  • thread.stop()调用之后,创建子线程的线程就会抛出ThreadDeatherror的错误,并且会释放子线程所持有的所有锁。一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用thread.stop()后导致了该线程所持有的所有的锁突然释放,那么被保护的数据就可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。因此,并不推荐使用stop()方法来终止线程。

五、线程相关

5.1 sleep()和wait()区别

  • 对于sleep()方法,我们首先要知道该方法是属于Thread类中的,而wait()方法,则是属于Object类中的。
  • sleep()方法导致了程序暂停执行指定的时间,让出CPU给其他线程,但是它依然处于监控状态,当指定时间到了又会自动恢复运行状态。
  • 调用sleep()方法的过程中,线程不会释放对象锁。
  • 调用wait()方法的时候,线程会释放对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

5.2 start()和run()的区别

  • start()方法来启动线程,真正实现了多线程运行。这时无需等待run()方法体代码执行完毕,可以继续执行下面的代码。
  • 通过调用Thread类的start()方法来启动一个线程,此时线程是处于就绪状态,并没有运行。
  • 方法run()称为线程体,它包含了要执行的这个线程的内容,次线程终止。然后CPU在调度其他线程。

5.3 Java后台线程(守护线程)

  • 定义:守护线程–也称“服务线程”,他是后台线程,它有一个特性,即为用户线程 提供 公共服务,在没有用户线程可服务时会自动离开。
  • 优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
    设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为守护线程的方式是在 线程对象创建 之前 用线程对象的setDaemon方法。
  • 在Daemon线程中产生的新线程也是Daemon的。
  • 守护线程则是JVM级别的,以Tomcat 为例,如果你在Web 应用中启动一个线程,这个线程的生命周期并不会和Web应用程序保持同步。也就是说,即使你停止了Web应用,这个线程依旧是活跃的。
  • example: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
  • 生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 终止线程的几种方式 的相关文章

  • 光学标记阅读器的开源库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要一个用于光学标记读取 OMR 的开源库 有这样的库吗 我想在我的 java 应用程序中使用这个库 zxing 可能对你有用 http
  • Java 的 System.arraycopy() 对于小数组有效吗?

    是Java的System arraycopy 对于小数组来说是高效的 或者它是本机方法这一事实是否使其可能比简单的循环和函数调用效率低得多 本机方法是否会因跨越某种 Java 系统桥梁而产生额外的性能开销 稍微扩展一下 Sid 所写的内容
  • 为什么Java HashMap的最大容量是1<<30而不是1<<31?

    Why is the maximum capacity of a Java HashMap 1 lt lt 30 and not 1 lt lt 31 even though the max value of an int is 231 1
  • 寻找 WebElements,最佳实践

    在我们当前的自动化 使用 Selenium WebDriver Java 中 我们使用 FindBy very广泛地 例如 FindBy css a name bcrumb protected List
  • 如何在JUnit测试中将MockWebServer端口设置为WebClient?

    我在用着spring boot with WebClient 它被自动装配为一个 bean 问题 写一个junit集成测试 我必须使用okhttpMockWebServer 该模拟始终在随机端口上启动 例如localhost 14321 N
  • 嵌套枚举是静态的吗?

    读书时这个问题 https stackoverflow com questions 25011061 why can enum implementations not access private fields in the enum cl
  • Stream#limit 返回的元素是否可以少于预期?

    如果流s下面至少有n元素 流在什么情况下sLimit可能少于n元素 如果有的话 Stream sLimit s limit n 提问原因 在这个答案 https stackoverflow com a 28082107 829571 我读到
  • Tomcat JDBC 池中没有足够的空闲连接

    给定以下 Tomcat JDBC 连接设置
  • 使用java读取Excel工作表的单列

    我有一张 Excel 表格 我想编写一个方法 该方法将参数作为要读取的列号 并返回一个由该列中的所有数据组成的数组 然后将该列元素放置在 xml 工作表中 我怎样才能编写一个方法来做到这一点 使用 Apache POI 您可以在他们的使用页
  • Restful WS 中的 WSDL 等价物是什么?如果没有,消费者如何生成所需的客户端类?

    比如说 我在java中有生产者 在 net中有消费者 生产者有一个方法 需要 员工作为方法参数并在数据库中创建员工 对于基于 SOAP 的 ws dot net 客户端将调用 WSDL 并创建存根 包括 dot net 中的员工数据表示 现
  • 在Java中使用==而不是equals来比较不可变对象可以吗

    考虑调用静态工厂方法 valueOf 的两个 Integer 类型的引用 如下所示 Integer a Integer valueOf 10 Integer b Integer valueOf 10 考虑到Integer是不可变的 使用 而
  • jsf 中的类型未找到属性

    我正在尝试调用 jsf 中使用 primefaces 的属性 但我有错误 500 在托管bean PersonelBean 类型上找不到 我正在使用 hibernate jsf 和 spring PersonelBean java Mana
  • 在同一台计算机上设置 JBoss 的多个实例

    我在 JBoss 社区中找到了下一页 http www jboss org community wiki ConfigurePorts http www jboss org community wiki ConfigurePorts 有下一
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • Google App Engine数据存储区字符串编码问题

    你好 我正在使用 Google App Engine 进行一个项目 并且需要存储一些字符串 我正在使用 Java 和JDOHelper getPersistenceManagerFactory transactions optional 在
  • servlet 如何获取 servlet 之外的文件的绝对路径?

    我们一直在使用 System getProperties user dir 来获取属性文件的位置 现在它已经部署在 Tomcat 上 通过 servlet 系统调用将位置指定为 tomcat 而不是属性文件所在的位置 我们如何动态调用属性文
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显
  • 在测试期间调用预定方法[重复]

    这个问题在这里已经有答案了 我正在使用 Maven 开发 SpringBoot 应用程序 我有一个班级 Component有方法的注释m与 Scheduled initialDelay 1000 fixedDelay 5000 注解 这里f
  • 在 Vavr 中结合任一者?

    我有几个Vavr https www vavr io Either https www vavr io vavr docs either的 我想调用一个函数Right每个 Either 的值 例如 Either
  • Java applet 是否会违反同源策略

    我需要请求一些东西并从其他域获取信息 我知道由于同源政策 javascript 无法做到这一点 我的另一个选择是通过我的服务器发出代理请求 我不希望请求来自我的服务器的 IP 也不想为我的服务器创建额外的负载 并且希望客户端这样做 是否可以

随机推荐

  • ansible定时任务模块和用户组模块使用

    接上篇 还是一些基础模块的使用 这里主要介绍的是系统模块的使用 下面例子都进行过相关的实践 从而可以直接进行使用相关的命令 3 用户模块的使用 用户模块主要用来管理用户账号和用户的属性 对远程主机用户进行批量管理 用户模块依赖的指令为use
  • 数据回归算法

    文章目录 效果一览 文章概述 研究内容 程序设计 参考资料 效果一览 文章概述 数据回归算法 Matlab实现高斯过程回归预测模型 研究内容 高斯过程回归 Gaussian Process Regression 是一种基于概率的非参数回归方
  • [转]DLL中使用全局变量

    默认只是 其宿主进程的全局变量 也是说 每个宿主程序都有这个副本 所以这个全局变量不能被所有进程共用 windows好像是用 copy on write机制进行保护的 如果共用 需要设置共享段 并把它放到共享段中 这样 一个宿主进程改了它的
  • 第十三届蓝桥杯省赛 最优清零方案题解

    题目描述 给定一个长度为N的数列A1 A2 AN 现在小蓝想通过若干次操作将这个数列中每个数字清零 每次操作小蓝可以选择以下两种之一 选择一个大于0的整数 将它减去1 选择连续K个大于0的整数 将它们各减去1 小蓝最少经过几次操作可以将整个
  • 电流反馈型运放电路设计指南

    刚开始使用电流反馈型运放时 总会从资料上看到这样的信息 电流反馈型运放直流特性不好 适合放大高频的交流信号 带宽不因频率增加而减小 也就是没有增益带宽积的概念 再深一点 CFB运放的反馈电阻需为恒定的值 为了弄清楚这些问题 我看过很多英文应
  • 为qt安装第三方插件qwt,可以在creator设计界面中拖拽

    前言 个人笔记 欢迎探讨 注意事项 1 如下步骤涉及的编译器 必须和creator使用的版本一样 而creator使用的编译器版本 可以通过qt的creator界面帮助菜单中查看关于creator得到 我使用的是creator4 4 1 编
  • Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知 binlog日志对于mysql数据库来说是十分重要的 在数据丢失的紧急情况下 我们往往会想到用binlog日志功能进行数据恢复 定时全备份 binlog日志恢复增量数据部分 化险为夷 一 简单了解binlogMySQL的二进制日志
  • Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法

    最近在编写Python脚本过程中遇到一个问题比较奇怪 Python脚本完全正常没问题 但执行总报错 AttributeError module object has no attribute xxx 这其实是 pyc文件存在问题 问题定位
  • 人机交互-7-交互需求定义

    1 背景 无论取代或更新已有系统 还是开发新产品 需求的建立都是非常重要的 需求获取是项目设计的第一个阶段 确定和记录现有的工作流程 收集 将信息组织起来 整体上涵盖工作的各个方面 描述 产品是不同的 对需求提出了特殊的要求 用户是不同的
  • Spring中@Controller 和 @RestController 的作用与区别

    一 Controller 和 RestController都是Spring XXX类是否可以接收HTTP请求 二 Controller 和 RestController的不同点 当用 Controller时在方法上必须添加注解 Respon
  • 使用SVN钩子强制提交日志和限制提交文件类型

    作者 朱金灿 来源 http blog csdn net clever101 Subversion本身有很好的扩展性 用户可以通过钩子实现一些自定义的功能 所谓钩子实际上是一种事件机制 当系统执行到某个特殊事件时 会触发我们预定义的动作 这
  • python--判断闰年

    year int input 输入一个年份 if year 4 0 if year 100 0 if year 400 0 print 0 是闰年 format year else print 0 不是闰年 format year else
  • PyTorch训练简单的全连接神经网络:手写数字识别

    文章目录 pytorch 神经网络训练demo 输出结果 来源 pytorch 神经网络训练demo 数据集 MNIST 该数据集的内容是手写数字识别 其分为两部分 分别含有60000张训练图片和10000张测试图片 神经网络 全连接网络
  • App Transport Security has blocked a cleartext HTTP 报错解决办法

    Xcode 7 创建新项目用到 UIWebView 发送请求时 报下面的错 App Transport Security has blocked a cleartext HTTP http resource load since it is
  • Java制造业MES系统源码-免费领取

    Java制造业MES系统源码 免费领取 一 技术架构 开发环境 idea MySQL git redis 软件架构 Spring Boot Mybatis MybatisPlus SpringDataJpa Redis WkHtmlToPd
  • Spring源码分析(十一)依赖注入源码解析4:DefaultListableBeanFactory#findAutowireCandidates 根据类型查找所有候选Bean

    根据类型查找所有候选Bean org springframework beans factory support DefaultListableBeanFactory findAutowireCandidates protected Map
  • linux 如何rsync实现增量同步文件到多台机器?

    背景 我需要经常把160机器上的文件 同步到171 111 105等 为什么选择rsync 它可以实现增量同步 这也是没选scp的原因 所以 我选择rsync来实现 解决方案步骤如下 1 安装 sudo apt get install rs
  • Mac M1 安装 Ruby

    在M1芯片的Macbook安装Ruby会遇到很多问题 比如 用ruby install会失败 rbenv install 2 7 2也会失败 我结合网上的一些方法把成功的流程梳理一下 供参考 第一步 安装gpg brew install g
  • 网络证书有含金量吗?(转)

    网络证书有含金量吗 转 more 老板 含金量 市场需求 个人能力 说到证书的含金量 微软某培训经理曾经在网上有一个非常精辟的论述 如果两个人都是清华大学计算机系本科毕业的 两个人毕业时工资会一样么 如果发展三年以后 我想工资会相差很大 但
  • Java 终止线程的几种方式

    一 正常运行结束 所谓正常运行结束 就是程序正常运行结束 线程自动结束 public class ThreadTest extends Thread public void run do something 二 使用退出标志退出线程 一般r