java 多线程6: 中断机制 优雅的终止java线程
public class Run {public static void main(String[] args) {try {MyThread thread = new MyThread();thread.start();Thread.sleep(2000);thread.interrupt();//请求中断MyThread线程} catch (InterruptedException e) {System.out.println("main catch");e.printStackTrace();}System.out.println("end!");}}
public class MyThread extends Thread {@Overridepublic void run() {super.run();for (int i = 0; i < 500000; i++) {if (this.interrupted()) {System.out.println("should be stopped and exit");break;}System.out.println("i=" + (i + 1));}System.out.println("this line is also executed. thread does not stopped");//尽管线程被中断,但并没有结束运行。这行代码还是会被执行}}
当MyThread获得CPU执行时,第6行的 if 测试中,检测到中断标识被设置。即MyThread线程检测到了main线程想要中断它的 请求。
大多数情况下,MyThread检测到了中断请求,对该中断的响应是:退出执行(或者说是结束执行)。
但是,上面第5至8行for循环,是执行break语句跳出for循环。但是,线程并没有结束,它只是跳出了for循环而已,它还会继续执行第12行的代码....
因此,我们的问题是,当收到了中断请求后,如何结束该线程呢?
一种可行的方法是使用 return 语句 而不是 break语句。。。。。哈哈。。。
不过使用return 没有抛异常那么好,不能将事件传播
优雅的解决
public class MyThread extends Thread {@Overridepublic void run() {super.run();try{for (int i = 0; i < 500000; i++) {if (this.interrupted()) {System.out.println("should be stopped and exit");throw new InterruptedException();}System.out.println("i=" + (i + 1));}System.out.println("this line cannot be executed. cause thread throws exception");//这行语句不会被执行!!!}catch(InterruptedException e){System.out.println("catch interrupted exception");e.printStackTrace();}}}
当MyThread线程检测到中断标识为true后,在第9行抛出InterruptedException异常。这样,该线程就不能再执行其他的正常语句了(如,第13行语句不会执行)。
因此,上面就是一个采用抛出异常的方式来结束线程的示例。尽管该示例的实用性不大。原因是我们 生吞了中断。
在第14行,我们直接catch了异常,然后打印输出了一下而已,调用栈中的更高层的代码是无法获得关于该异常的信息的。
第16行的e.printStackTrace()作用就相当于
1.仅仅记录 InterruptedException 也不是明智的做法,因为等到人来读取日志的时候,再来对它作出处理就为时已晚了。
@Override
public void run() throws InterruptedException{//这是错误的
//do something...
代码改良
public class MyThread extends Thread {@Overridepublic void run() {super.run();try{for (int i = 0; i < 500000; i++) {if (this.interrupted()) {System.out.println("should be stopped and exit");throw new InterruptedException();}System.out.println("i=" + (i + 1));}System.out.println("this line cannot be executed. cause thread throws exception");}catch(InterruptedException e){/**这样处理不好* System.out.println("catch interrupted exception");* e.printStackTrace();*/Thread.currentThread().interrupt();//这样处理比较好}}}
java 多线程6: 中断机制 优雅的终止java线程的更多相关文章
- Java 多线程基础(十)interrupt()和线程终止方式
Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...
- Java多线程干货系列—(一)Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- [转]Java多线程干货系列—(一)Java多线程基础
Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...
- Java多线程编程核心技术-第1章-Java多线程技能-读书笔记
第 1 章 Java 多线程技能 本章主要内容 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 1.1 进程和多线程的概念及线程的优点 进程是操作系统结构的基础:是一次程 ...
- “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- JAVA多线程之中断机制(stop()、interrupted()、isInterrupted())
一,介绍 本文记录JAVA多线程中的中断机制的一些知识点.主要是stop方法.interrupted()与isInterrupted()方法的区别,并从源代码的实现上进行简单分析. JAVA中有3种方 ...
- JAVA多线程之中断机制(如何处理中断?)
一,介绍 这篇文章主要记录使用 interrupt() 方法中断线程,以及如何对InterruptedException进行处理.感觉对InterruptedException异常进行处理是一件谨慎且 ...
- Java多线程总结(二)锁、线程池
掌握Java中的多线程,必须掌握Java中的各种锁,以及了解Java中线程池的运用.关于Java多线程基础总结可以参考我的这篇博文Java多线程总结(一)多线程基础 转载请注明出处——http://w ...
随机推荐
- libevent个人理解
1.利用了前置声明来在c语言的基础上进行封装操作.即在include目录下防止event.h等头文件,在这些头文件中只暴露struct的声明却不暴露其定义,对于如event_base等结构的操作均使用 ...
- C语言第一个例子hello world
1.用文本编辑器编辑代码如下,然后保存为hello.c文件 #include <stdio.h> int main(void){ printf("hello world" ...
- 捕获Chrome浏览器全屏退出事件
参考地址 document.addEventListener("fullscreenchange", function(e) { console.log("fullscr ...
- 笔记本连接老式显示器(VGA线+HDMI接口)
参考:http://www.cnblogs.com/me115/p/3970945.html
- mysql优化利器之explain
一.语法 {EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild] {EXPLAIN | DESCRIBE | DESC} [explain_typ ...
- HDUOJ--------1003 Max Sum
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- logback+slf4j作为日志系统
一.logback简介 log4j和logback作者是同一人:CekiGülcü.log4j和logback都是实打实的日志系统. commons-logging,slf4j这两者是日志大管家.sl ...
- php 回收周期(Collecting Cycles)
http://docs.php.net/manual/zh/features.gc.collecting-cycles.php 传统上,像以前的 php 用到的引用计数内存机制,无法处理循环的引用内存 ...
- java IO 入门例子
import java.io.File; /** * File类型基本操作 */ /** * @author Administrator * */ public class FileDemo { /* ...
- Fusion Tables 图层用于呈现 Google Fusion Tables 中包含的数据
Google Maps API 允许您使用 FusionTablesLayer 对象将 Google Fusion Tables 中包含的数据呈现为地图上的图层.Google Fusion Table ...