停止线程

停止线程的思路

①使用退出标志,使线程正常退出,也就是当run()方法结束后线程终止。

class Thread01 extends Thread {

    // volatile关键字解决线程的可见性问题
volatile boolean flag = true; @Override
public void run() {
while (flag) {
try {
// 可能发生异常的操作
System.out.println(getName() + "线程一直在运行。。。");
} catch (Exception e) {
System.out.println(e.getMessage());
this.stopThread();
}
}
} public void stopThread() {
System.out.println("线程停止运行。。。");
this.flag = false;
}
} public class StopThreadDemo01 { public static void main(String[] args) {
Thread01 thread01 = new Thread01();
thread01.start(); try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread01.stopThread();
}
}

②使用stop()方法强行终止线程,这个方法已经被弃用了,所以这里不写。

③使用interrupt()方法中断线程(只有线程在waitsleep才会捕获InterruptedException异常,执行终止线程的逻辑,在运行中不会捕获)

class Thread02 extends Thread {
private boolean flag = true; @Override
public void run() {
while (flag) {
synchronized (this) {
// try {
// wait();
// } catch (InterruptedException e) {
// e.printStackTrace();
// this.stopThread();
// } try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
this.stopThread();
}
}
}
} public void stopThread() {
System.out.println("线程已经退出。。。");
this.flag = false;
}
} public class StopThreadDemo02 { public static void main(String[] args) {
Thread02 thread02 = new Thread02();
thread02.start();
System.out.println("线程开始");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread02.interrupt();
}
}

调用interrupt()方法会抛出InterruptedException异常,捕获后再做停止线程的逻辑即可。

如果线程处于类似while(true)运行的状态,interrupt()方法无法中断线程。

源码地址

最新文章

  1. plist文件里的"Bundle versions string, short" 跟 "Bundle version" 的区别及作用
  2. RTC,登陆后添加权限值
  3. 十、Android学习第九天——小结(转)
  4. dp核心问题研究-从入门到放弃
  5. 【LeetCode OJ】Linked List Cycle
  6. 【转】Eclipse Java注释模板设置详解
  7. beaglebone-black 在Angstrom系统中的网络配置方法
  8. IntelliJ IDEA14如何配置tomcat
  9. Log4net 列
  10. 使用TypeScript实现简单的HTML5贪吃蛇游戏
  11. 被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」
  12. QT4.8.5 连接数据库(读写数据)
  13. oracle 11g rac R2 for linux change(public,vip)IP ,hostname (oracle 11g rac R2 修改公有,虚拟,私有IP,网卡)
  14. 基于jeesite的cms系统(七):GlobalException全局异常和部署
  15. C++ Exception机制
  16. DHTMLX Tree中文开发指导
  17. linux运维、架构之路-linux文件属性
  18. 阻止新的csproj工程的dll引用继承
  19. 算法笔记_200:第三届蓝桥杯软件类决赛真题(C语言本科)
  20. 轻量级ORM框架Dapper应用八:使用Dapper实现DTO

热门文章

  1. 大数据之Hadoop完全分布式集群搭建
  2. spring配置文件拆分策略及方法
  3. NIO、BIO、AIO
  4. Css几个兼容性问题
  5. 第二篇 jQuery 选择器
  6. Delphi Opendialog组件
  7. 2019.10.28sql注入工具
  8. skywalking 6.1 简明指南
  9. 浙大数据结构课后习题 练习一 7-1 Maximum Subsequence Sum (25 分)
  10. new一个有父类的对象时各代码块的执行顺序问题