错误用例

下面用例中,一个正在sleep的线程,在调用interrupt后,wait方法检查到isInterrupted()为true,抛出异常, 而catch到异常后没有处理。一个抛出了InterruptedException的线程的在调用interrupt后状态马上就会被置为非中断状态。如果catch语句没有处理异常,则下一 次循环中isInterrupted()为false,线程会继续执行,程序无法正常退出。

import lombok.extern.slf4j.Slf4j;@Slf4j
public class SparkStreamThread implements Runnable {public void stopStream() {this.log.warn("Stop Stream!!");}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "将要运行...");while (!Thread.currentThread().isInterrupted()) {System.out.println(Thread.currentThread().getName() + "运行中");try {Thread.sleep(400);} catch (InterruptedException e) {System.out.println(Thread.currentThread().getName() + "从阻塞中退出...");System.out.println("this.isInterrupted()=" + Thread.currentThread().isInterrupted());}}System.out.println(Thread.currentThread().getName() + "已经终止!");}public static void main(String argv[]) throws InterruptedException {Thread ta = new Thread(new SparkStreamThread());ta.start();Thread.sleep(2000);System.out.println(ta.getName() + "正在被中断...");ta.interrupt();System.out.println("ta.isInterrupted()=" + ta.isInterrupted());}
}

正确用例1,异常捕获后终止线程

import lombok.extern.slf4j.Slf4j;@Slf4j
public class SparkStreamThread implements Runnable {public void stopStream() {this.log.warn("Stop Stream!!");}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "将要运行...");while (!Thread.currentThread().isInterrupted()) {System.out.println(Thread.currentThread().getName() + "运行中");try {Thread.sleep(400);} catch (InterruptedException e) {System.out.println(Thread.currentThread().getName() + "从阻塞中退出...");Thread.currentThread().interrupt();System.out.println("this.isInterrupted()=" + Thread.currentThread().isInterrupted());}}System.out.println(Thread.currentThread().getName() + "已经终止!");}public static void main(String argv[]) throws InterruptedException {Thread ta = new Thread(new SparkStreamThread());ta.start();Thread.sleep(2000);System.out.println(ta.getName() + "正在被中断...");ta.interrupt();System.out.println("ta.isInterrupted()=" + ta.isInterrupted());}
}

 

正确用例2, 使用变量,double check,二次检查

public class ThreadA extends Thread {private boolean isInterrupted=false;int count=0;public void interrupt(){isInterrupted = true;super.interrupt();}public void run(){System.out.println(getName()+"将要运行...");while(!isInterrupted){System.out.println(getName()+"运行中"+count++);try{Thread.sleep(400);}catch(InterruptedException e){System.out.println(getName()+"从阻塞中退出...");System.out.println("this.isInterrupted()="+this.isInterrupted());}}System.out.println(getName()+"已经终止!");}
}

转载于:https://www.cnblogs.com/bigbigtree/p/6774479.html

Java——安全地停止线程相关推荐

  1. java executorser 停止_Java使用ExecutorService来停止线程服务

    使用ExecutorService来停止线程服务 之前的文章中我们提到了ExecutorService可以使用shutdown和shutdownNow来关闭. 这两种关闭的区别在于各自的安全性和响应性 ...

  2. java 中如何正确的停止线程

    如何优雅的停止一个线程 1.为什么要停止线程 2.为何说要正确的停止线程 3.使用interrupt()停止线程 4.线程在通常三种情况下停止 4.1 普通情况 4.2 线程阻塞情况 4.3 传递中断 ...

  3. 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)

    一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...

  4. java 线程强制停止线程_java多线程之停止线程

    在多线程开发中停止线程是非常重要的技术点. 停止线程在Java语言中并不像break语句那样干脆.须要一些技巧性的处理. 一.  异常法 採用异常法来停止一个线程.首先我们须要了解一下两个方法的使用方 ...

  5. java 线程停止在那个为止_java停止线程

    本文将介绍jdk提供的api中停止线程的用法. 停止一个线程意味着在一个线程执行完任务之前放弃当前的操作,停止一个线程可以使用Thread.stop()方法,但是做好不要使用它,它是后继jdk版本中废 ...

  6. 测试停止线程(Java)

    测试停止线程(Java) 1.建议线程正常停止->利用次数,不建议死循环 2.建议使用标志位->设置一个标志 3.不要使用stop或者destroy等过时或者JDK不建议使用的方法 pac ...

  7. java以正确的方式停止线程

    java线程停止可以说是非常有讲究的,看起来非常简单,但是也要做好一些防范措施,一般停止一个线程可以使用Thread.stop();来实现,但是最好不要用,因为他是不安全的. 大多数停止线程使用Thr ...

  8. Java停止线程的3种方式

    在Java中有以下3种方式终止正在运行的线程: 使用退出标志,使线程正常退出: 使用stop()方法强行终止线程,不推荐使用该方法,JDK已声明弃用: 使用interrupt方法中断线程. 使用标志位 ...

  9. java 动态增加线程,java - 在Java中动态停止线程 - SO中文参考 - www.soinside.com

    我需要一些有关线程的帮助,我需要制作一个可以动态关闭和打开线程的程序(这意味着当我需要一个线程时,它将运行,如果不再需要它,它将停止),现在我的问题是?如果我仅终止该线程的run方法,将其计为线程停止 ...

最新文章

  1. 33 张图详解 RSTP 、MSTP、替代技术
  2. Linux 防火墙命令的操作命令CentOS
  3. 研究生自学python好找工作么-学完Python好找工作吗?为什么有人学完找不到工作?...
  4. 无监督分类:聚类分析(K均值)
  5. asp.net 能否多线程断点续传?
  6. webpack的一些常用配置 (转)
  7. 扛并发主力军,引入应用层缓存
  8. Leetcode 904.水果成蓝(滑动窗口,哈希容器map
  9. Python+OpenCV:尺度不变特征变换 (SIFT, Scale-Invariant Feature Transform)
  10. VSCode尝试在目标目录创建文件发生错误
  11. 树莓派与 Python —— GPIO
  12. Usaco2012-2013 金组 题解 (暂缺Hill walk以及Figue eight)
  13. VUE PDF上传预览下载(vue-pdf)
  14. CSS 3 颜色属性
  15. IE 浏览器 判断 增加 支持 IE8 IE9 IE10 IE11等 IE浏览器(是不是IE浏览器判断)
  16. Android App Widget中如何调用RemoteView中的函数
  17. Python数据挖掘-NLTK文本分析+jieba中文文本挖掘
  18. [旭日x3] 动手实践之bpu_rezie以及简化cpp编译流程
  19. 如何使用TeamViewer在局域网内远程连接另一台电脑
  20. T100 开发笔记-210928

热门文章

  1. 第二章 ASP.NET MVC (视图传值到控制器)
  2. springboot自动配置原理_今日份学习之Spring Boot自动配置实现原理
  3. 虚树(bzoj 3572: [Hnoi2014]世界树)
  4. [Python + PyQt5] 均匀平面波的入射、反射及透射的仿真实验
  5. hbase工作 架构原理
  6. Java项目上出现红色感叹号
  7. cmd下dir后导入oracle数据库,Oracle在dos命令下导出导入
  8. Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL
  9. java多线程基础篇第一篇-JMM
  10. Spark算子与RDD基本转换