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

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

使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止。

使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据,不符合完整性,所以被废弃。So, forget it!

使用 interrupt 方法中断线程。注意使用interrupt()方法中断正在运行中的线程只会修改中断状态位,可以通过isInterrupted()判断。如果使用interrupt()方法中断阻塞中的线程,那么就会抛出InterruptedException异常,可以通过catch捕获异常,然后进行处理后终止线程。有些情况,我们不能判断线程的状态,所以使用interrupt()方法时一定要慎重考虑。

使用volatile标志位

看一个简单的例子:

首先,实现一个Runnable接口,在其中定义volatile标志位,在run()方法中使用标志位控制程序运行。

public class MyRunnable implements Runnable {

//定义退出标志,true会一直执行,false会退出循环

//使用volatile目的是保证可见性,一处修改了标志,处处都要去主存读取新的值,而不是使用缓存

public volatile boolean flag = true;

public void run() {

System.out.println("第" + Thread.currentThread().getName() + "个线程创建");

try {

Thread.sleep(1000L);

} catch (InterruptedException e) {

e.printStackTrace();

}

//退出标志生效位置

while (flag) {

}

Sys

java退出线程死循环_Java中如何终止运行中的线程;while(true){i++;}死循环是如何跳出的...相关推荐

  1. 有3个线程ABC。按照ABC来运行(A线程输出A,B线程输出B,C线程输出C,以此类推,循环输出)。

    个人记录:2018年,工作的第6到7个年头. 重点研究自己不太擅长的技术:分布式.高并发.大数据量.数据库优化.高性能.负载均衡等. 刷题是一种态度,是一种好习惯. 有3个线程ABC.按照ABC来运行 ...

  2. java执行器是什么_java使用Executor(执行器)管理线程

    一.一个实现了Runnable接口的类 class MyThread implementsRunnable{private static int num = 0; @Overridepublic vo ...

  3. java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...

    学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...

  4. java数据类型的站位_Java 数据类型在实际开发中应用

    在前边的文章中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型.在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的 ...

  5. java等待5秒_Java并发编程-主线程等待子线程解决方案

    主线程等待所有子线程执行完成之后,再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { System.ou ...

  6. java object取数据_java使用ObjectInputStream从文件中读取对象

    import java.io.EOFException; import java.io.FileInputStream; import java.io.FileNotFoundException; i ...

  7. java线程死亡_java – 如何暂停main()直到所有其他线程死亡?

    在我的程序中,我在main()方法中创建了几个线程. main方法的最后一行是调用System.out.println(),在所有的线程都死了之前我不想调用它.我已经尝试在每个线程上调用Thread. ...

  8. java 多线程 共享数据_JAVA多线程提高四:多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  9. java ldap操作实例_Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法...

    java ldap操作实例 LDAP身份验证是世界上最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft为Windows提供的LDAP实现)是另一种广泛使用的 ...

  10. 基于java洗浴中心管理系统_Java小白也能听懂的线程池的内部原理:老王的洗浴中心...

    餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:"经常听你说线程池,到底线程池到底是个什么原理?"我楞了一下,心里想女朋友今天是怎么了,怎么突 ...

最新文章

  1. 字符串常量是一个字符数组
  2. 自定义控件:流式布局
  3. C#透明窗体实现方法
  4. Oracle 数据库实例启动关闭过程
  5. 【jQuery笔记Part2】02-jQuery展开收起动画帷幔效果案例下拉菜单案例显示隐藏更多案例折叠菜单案例
  6. VLAN间路由:每个VLAN一个物理连接,单臂路由,三层交换
  7. vscode regex previewer插件怎么用_分享五款开挂神器!助你效率倍增!做PPT怎么能不会用插件?...
  8. vue路由vue-router的使用
  9. abaqus算出来的转角单位是什么_abaqus中后处理中U的单位是什么?
  10. 繁凡的 ACM 退役记(一名普通算法竞赛选手与博主的竞赛生涯回忆录)凡是过往,皆为序章
  11. windows下使用命令打开pdf文件
  12. 百度脑图制作的简单的个人介绍
  13. 计算机打开远程桌面服务,如何开启Windows远程桌面服务 | 远程操作自己的电脑...
  14. python操作 e'xcel表格
  15. 3款常见的网站文章采集工具推荐(2019最新)
  16. MYSQL之STRAIGHT_JOIN
  17. 箱线图(Boxplot)
  18. Android高德地图线优化,Android 接入高德地图SDK模块的优化点点滴滴
  19. 使用charCodeAt()和charAt()方法,根据Unicode 编码,转换字符
  20. PID控制器——MATLAB/Simulink仿真以及性能比较与分析

热门文章

  1. Pandas数据分析31——全国城市房价分析及样式可视化
  2. 【大学软件测试基础】网站申请注册 - 等价类划分法
  3. 关闭vue.js代码规范Eslint,脚手架新版以及旧版,简单方式
  4. ITSM Back To Basics – The Service Catalogue
  5. java io 系列之1 decorator模式
  6. 关键字之C语言中的32好汉
  7. java url文件大小,如何在java中从URL计算文件大小
  8. 键盘事件 和键码一览整理
  9. https://www.qimai.cn/app/baseinfo/appid/1137991229/country/cn
  10. Hexo-Fluid主题美化