Thread.stop,Thread.suspend,Thread.resume,Runtime.runFinalizersOnExit都已经被废弃了。
为什么要废弃Thread.stop?因为此函数天然的不安全。
骤然停止一个线程,会造成该线程已经占有的资源无法释放,进而引发一系列无法预知的错误。而技术上实现骤然停止后释放资源不太可行。
一种推荐的线程停止方法:while(flag)
在Thread的run函数中写成while(flag)的形式,通过控制flag来控制线程是否停止,这样是完全可控的。

然而并非所有的多线程任务都可以写成while(flag)的形式。

线程所做的任务分为两类:运行状态和非运行状态
非运行状态包括:

  • Thread.sleep
  • 正在wait
  • IO阻塞时,读文件或者网络请求

对于非运行状态:当线程处于wait或者sleep状态时,可以使用thread.interupt方法来终止线程,这样可以保证正确地停止一个线程。
当线程处于IO阻塞时,interupt是否管用取决于所在平台,Linux和Mac可以使用interupt来终止线程,windows却不能。

而当线程处于运行状态时,目前没有完美的解决方法来终止一个线程。

Thread.destroy函数一直没有实现,这个函数里面是空的。

下面看几个例子:
demo1:使用interupt叫醒正在sleep的线程

public class One {
static Runnable x = new Runnable() {@Overridepublic void run() {try {Thread.sleep(12000);} catch (InterruptedException e) {e.printStackTrace();}}
};public static void main(String[] args) {Thread m = new Thread(x);m.start();System.out.println("haha");m.interrupt();System.out.println("game over");
}
}

这个程序很快运行完了,根本没有用12秒。

demo2:使用interupt无法叫醒正在运行的线程

public class Two {
static Runnable x = new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("haha");}}
};public static void main(String[] args) {Thread m = new Thread(x);m.start();m.interrupt();System.out.println("over");
}
}

这个程序永远都不会停止。
在此例中,如果把while循环放在try catch内部,则能够正常跳出循环,使得interupt变得可能可行,因为当Thread正在执行System.out.println("haha");这句话时,interupt是无效的,就不会抛出异常,也就无法跳出循环。

参考资料

https://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
https://www.cnblogs.com/gpcuster/archive/2010/01/18/1650273.html

转载于:https://www.cnblogs.com/weiyinfu/p/8124091.html

如何终止Java线程相关推荐

  1. Java终止当前线程的方法

    2019独角兽企业重金招聘Python工程师标准>>> 在系统开发中常常设计到多线程的使用,正常需求下开启线程不需要中途停止,特殊需求下需要停止当前线程(我当前的网页爬取系统中用到, ...

  2. Java 线程实例二(终止线程、生产者/消费者问题、获取线程状态、获取所有线程、查看线程优先级、中断线程)

    终止线程 Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用. 本文向大家介绍使用interrupt方法中断线程. 使用interrupt方法来终 ...

  3. Java多线程基础学习,Thread解读、java线程的状态、同步和异步、两阶段终止模式

    理论概述 单线程和多线程 为什么要使用多线程呢?多线程有什么好处呢? 如果在程序中,需要读写一个文件,该文件很大,那我们执行到该io操作时,cpu就会等待该io操作执行完才会继续运行下面的代码,进程调 ...

  4. Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  5. 并发基础(九) java线程的终止与中断

    1.简单了解一下:为何不赞成使用 Thread.stop.Thread.suspend 和 Thread.resume?   suspend .resume.stop方法分别完成了线程的暂停.恢复.终 ...

  6. java并发编程之正确地终止一个线程interrupt/interrupted

    以下demo是错误的终止线程的demo(使用thread.stop()方法实现终止线程): public class ErrorStopThreadDemo {public static void m ...

  7. java 线程退出cmd_java 线程的终止与线程中断

    关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结 ...

  8. java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...

    第12章 Java内存模型与线程 前言: 1.物理机如何处理并发问题? 2.什么是Java内存模型? 3.原子性.可见性.有序性的具体含义和应用实现? 4.volatile 关键字特性? 5.基于vo ...

  9. 2017年50道Java线程面试题

    下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编 ...

最新文章

  1. linux安装系统配置环境变量,Linux系统安装jdk及配置环境变量的方法
  2. Windows远程桌面(mstsc)不能复制粘贴的解决办法
  3. No result defined for action action.QueryAction and result result
  4. 架构漫谈(三):如何做好架构之识别问题
  5. c# 获取文件路径[转]
  6. 组件端Apollo配置放到NAS中
  7. 电厂数字化进阶之路(一):光明的使者
  8. Python微博评论进行情感分析
  9. 【数据分析】⚠️走进数据分析 3⚠️ Beautiful Soup 提取页面信息
  10. 在 Github 制作在线简历 PDF
  11. java安卓登入界面代码_android项目——登录界面
  12. 怎么让电脑上的图片全屏显示呢
  13. 分治策略时间复杂度计算
  14. Linux配置多网口IP地址,linux配置ip 多个网口
  15. 四种电子取证软件的比较
  16. 高德 android 多边形中心点,完美起航-android高德地图画多边形,已知中心点宽高画矩形,实际距离千米转地图坐标距离...
  17. 与谷歌、Facebook 抢夺 AI 人才和公司资源,爱彼迎加入 AI 战场
  18. python银行自动取款机系统详写
  19. python爬虫爬取中国天气网_【实战】中国天气网爬虫之华北城市数据爬取
  20. 解决Invalid numeric Value:Leading zeroes not allowed问题

热门文章

  1. 从Paxos到ZooKeeper-四、ZooKeeper技术内幕
  2. 激光笔可以测光纤通断吗?
  3. ASIHTTPRequest类库简介
  4. 分享基于silverlight的一个大文件上传控件
  5. 如何让程序集在每次编译时自动产生不同的版本号
  6. 【渗透测试实战】具体案例——讲讲SQL注入攻击是怎么回事?
  7. 3个最典型的图表错误使用方式,赶紧看看自己是否中招
  8. 如何用产品经理的思维设计移动报表
  9. EXCEL的底层实现
  10. 解决AS3 Socket编程中最令人头疼的问题