Java——安全地停止线程
错误用例
下面用例中,一个正在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——安全地停止线程相关推荐
- java executorser 停止_Java使用ExecutorService来停止线程服务
使用ExecutorService来停止线程服务 之前的文章中我们提到了ExecutorService可以使用shutdown和shutdownNow来关闭. 这两种关闭的区别在于各自的安全性和响应性 ...
- java 中如何正确的停止线程
如何优雅的停止一个线程 1.为什么要停止线程 2.为何说要正确的停止线程 3.使用interrupt()停止线程 4.线程在通常三种情况下停止 4.1 普通情况 4.2 线程阻塞情况 4.3 传递中断 ...
- 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)
一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...
- java 线程强制停止线程_java多线程之停止线程
在多线程开发中停止线程是非常重要的技术点. 停止线程在Java语言中并不像break语句那样干脆.须要一些技巧性的处理. 一. 异常法 採用异常法来停止一个线程.首先我们须要了解一下两个方法的使用方 ...
- java 线程停止在那个为止_java停止线程
本文将介绍jdk提供的api中停止线程的用法. 停止一个线程意味着在一个线程执行完任务之前放弃当前的操作,停止一个线程可以使用Thread.stop()方法,但是做好不要使用它,它是后继jdk版本中废 ...
- 测试停止线程(Java)
测试停止线程(Java) 1.建议线程正常停止->利用次数,不建议死循环 2.建议使用标志位->设置一个标志 3.不要使用stop或者destroy等过时或者JDK不建议使用的方法 pac ...
- java以正确的方式停止线程
java线程停止可以说是非常有讲究的,看起来非常简单,但是也要做好一些防范措施,一般停止一个线程可以使用Thread.stop();来实现,但是最好不要用,因为他是不安全的. 大多数停止线程使用Thr ...
- Java停止线程的3种方式
在Java中有以下3种方式终止正在运行的线程: 使用退出标志,使线程正常退出: 使用stop()方法强行终止线程,不推荐使用该方法,JDK已声明弃用: 使用interrupt方法中断线程. 使用标志位 ...
- java 动态增加线程,java - 在Java中动态停止线程 - SO中文参考 - www.soinside.com
我需要一些有关线程的帮助,我需要制作一个可以动态关闭和打开线程的程序(这意味着当我需要一个线程时,它将运行,如果不再需要它,它将停止),现在我的问题是?如果我仅终止该线程的run方法,将其计为线程停止 ...
最新文章
- 33 张图详解 RSTP 、MSTP、替代技术
- Linux 防火墙命令的操作命令CentOS
- 研究生自学python好找工作么-学完Python好找工作吗?为什么有人学完找不到工作?...
- 无监督分类:聚类分析(K均值)
- asp.net 能否多线程断点续传?
- webpack的一些常用配置 (转)
- 扛并发主力军,引入应用层缓存
- Leetcode 904.水果成蓝(滑动窗口,哈希容器map
- Python+OpenCV:尺度不变特征变换 (SIFT, Scale-Invariant Feature Transform)
- VSCode尝试在目标目录创建文件发生错误
- 树莓派与 Python —— GPIO
- Usaco2012-2013 金组 题解 (暂缺Hill walk以及Figue eight)
- VUE PDF上传预览下载(vue-pdf)
- CSS 3 颜色属性
- IE 浏览器 判断 增加 支持 IE8 IE9 IE10 IE11等 IE浏览器(是不是IE浏览器判断)
- Android App Widget中如何调用RemoteView中的函数
- Python数据挖掘-NLTK文本分析+jieba中文文本挖掘
- [旭日x3] 动手实践之bpu_rezie以及简化cpp编译流程
- 如何使用TeamViewer在局域网内远程连接另一台电脑
- T100 开发笔记-210928
热门文章
- 第二章 ASP.NET MVC (视图传值到控制器)
- springboot自动配置原理_今日份学习之Spring Boot自动配置实现原理
- 虚树(bzoj 3572: [Hnoi2014]世界树)
- [Python + PyQt5] 均匀平面波的入射、反射及透射的仿真实验
- hbase工作 架构原理
- Java项目上出现红色感叹号
- cmd下dir后导入oracle数据库,Oracle在dos命令下导出导入
- Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL
- java多线程基础篇第一篇-JMM
- Spark算子与RDD基本转换