Java多线程(七)——线程中断
目录
一、引言
二、stop与interrupt
三、非阻塞线程被interrupt
四、阻塞线程被interrupt
五、总结
一、引言
线程中断在开始没有特别重视,多线程往后学习才发现线程中断也是件比较有技巧的事情,停止线程不像break语句中那样简单,什么时候停止,停止后代码是否执行,如何捕捉线程异常都是我们需要学习的内容。
正常情况下我们停止线程有三种方法
使用退出标志,使线程正常退出,也就是当run方法完成后才停止;
就是我们上面所说的使用stop方法强行终止线程,是过期作废的方法,这种方法可以排除不用;
使用interrupt方法终止线程。
第一种比较常见这里建议使用第三种也重点讲第三种,以及为什么在第二种和第三种选择了第二种。
二、stop与interrupt
stop方法比较强势,直接把所用的停止,但是因为威力太强大所以我们不建议使用,举个例子
public class Testinterrupt {public static void main(String [] args) {Thread thread= new Thread(new Runnable() {public void run() {System.out.println(Thread.currentThread().getName()+"start");try {Thread.sleep(4000);} catch (InterruptedException e) {System.out.println("线程中止");//线程终止后报异常}System.out.println(Thread.currentThread().getName()+"end");}});System.out.println(Thread.currentThread().getName()+"start");thread.start();try {Thread.sleep(2000);//thread.interrupt();//中止线程报异常,如果使用stop(),子线程与后面的代码不会执行thread.stop();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"end");}
}
输出结果:(结果是子线程在stop后面的全部没有输出,连个异常都没抛,但是使用interrupt方法后面的代码可以继续执行)
mainstart
Thread-0start
mainend
三、非阻塞线程被interrupt
先上个例子
public class Test3 {public static void main(String []args){final Thread thread1= new Thread(new Runnable() {public void run() {while (true){System.out.println(Thread.currentThread().getName()+"is running");if(Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName()+"interrupt,即将退出");//throw new InterruptedException();}//Thread.sleep(1000);//countDownLatch.countDown();}}});thread1.start();new Thread(new Runnable() {public void run() {
/* try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}*/try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}thread1.interrupt();}}).start();}}
输出结果:
Thread-0is running
Thread-0is running
Thread-0is running
Thread-0is running
Thread-0interrupt,即将退出
Thread-0is running
Thread-0interrupt,即将退出
Thread-0is running
Thread-0interrupt,即将退出
打印出来了即将推出字眼说明子线程已经被interrupt掉,但是我们发现子线程没有停止,那中断有个毛线用处,要他有何用?
表着急,线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。
下面进行手动抛出异常
public class Test3 {public static void main(String []args){final Thread thread1= new Thread(new Runnable() {public void run() {try {while (true){System.out.println(Thread.currentThread().getName()+"is running");if(Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName()+"interrupt,即将退出");throw new InterruptedException();}//countDownLatch.countDown();}} catch (InterruptedException e) {System.out.println("进入ExceptionInterrupt2 类中run方法的catch了!");e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"is ending");}});thread1.start();new Thread(new Runnable() {public void run() {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}thread1.interrupt();}}).start();}}
输出结果
Thread-0is running
Thread-0is running
Thread-0is running
Thread-0is running
Thread-0is running
Thread-0interrupt,即将退出
进入ExceptionInterrupt2 类中run方法的catch了!
java.lang.InterruptedExceptionat com.question.Test3$1.run(Test3.java:31)at java.lang.Thread.run(Thread.java:748)
Thread-0is ending
这次程序就在我们捕捉到异常的位置停止了
四、阻塞线程被interrupt
下面再写一个阻塞子线程被interrupt的例子
public class Test3 {public static void main(String []args){final Thread thread1= new Thread(new Runnable() {public void run() {//for (int i=0;i<10;i++)try {while (true){System.out.println(Thread.currentThread().getName()+"is running");if(Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName()+"interrupt,即将退出");throw new InterruptedException();}Thread.sleep(1000);}} catch (InterruptedException e) {System.out.println("进入ExceptionInterrupt2 类中run方法的catch了!");e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"is ending");}});thread1.start();new Thread(new Runnable() {public void run() {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}//System.out.println("到达5个,结束线程");thread1.interrupt();//System.out.println("到达5个,结束线程");}}).start();//service.shutdown();}}
输出结果:
Thread-0is running
进入ExceptionInterrupt2 类中run方法的catch了!
java.lang.InterruptedException: sleep interruptedat java.lang.Thread.sleep(Native Method)at com.question.Test3$1.run(Test3.java:33)at java.lang.Thread.run(Thread.java:748)
Thread-0is ending
阻塞线程会自动抛出异常,有点类似上面我们写的第二个例子,因为捕捉到了异常所以不会继续执行。
当一个线程处于中断状态时,如果再由wait、sleep以及jion三个方法引起的阻塞,那么JVM会将线程的中断标志重新设置为false,并抛出一个InterruptedException异常,然后开发人员可以中断状态位“的本质作用-----就是程序员根据try-catch功能块捕捉jvm抛出的InterruptedException异常来做各种处理,比如如何退出线程。总之interrupt的作用就是需要用户自己监视线程状态isinterrupted并进行处理。
五、总结
- stop与interrupt
- 非阻塞线程interrupt(手动抛异常)
- 阻塞线程interrupt
Java多线程(七)——线程中断相关推荐
- Java多线程之线程虚假唤醒
Java多线程之线程虚假唤醒 本文目录提纲 问题:两个线程对一个初始值为零的变量操作,实现一个线程加一,另一个线程减一,来十次. 问题:四个线程对一个初始值为零的变量操作,实现两个线程加一,另外两个线 ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- Java多线程与线程并发库高级应用笔记
以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...
- Java多线程之线程同步机制(锁,线程池等等)
Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- Java多线程之线程池配置合理线程数
Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...
- Java多线程之线程池的手写改造和拒绝策略
Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...
- Java多线程之线程池7大参数、底层工作原理、拒绝策略详解
Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...
- Java多线程之线程池详解
Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...
- Java多线程之线程通信之生产者消费者阻塞队列版
Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...
最新文章
- 腾讯云CentOS7.2+Django2.2+Python3.7+Nginx+Uwsgi 初学者部署教程
- 关于Android 8.0java.lang.SecurityException: Permission Denial错误的解决方法
- 利用svg技术实现在线动画演示
- 11.6 mpstat:CPU信息统计
- CF183D-T-shirtx【dp,贪心】
- 女士细线毛衣起多少针_从起针到缝合,教你织毛衣的各种要点(详细教程)
- matlab如何提高运算速速,如何提高以下程序的运算速度及有选择性的保存数据?...
- c语言中0xof423什么意思,C语言指针 百思不得其解的一个问题
- 【poj2096】Collecting Bugs 期望dp
- 用httpPost对JSON发送和接收的例子
- 所有锁的unlock要放到try{}finally{}里,不然发生异常返回就丢了unlock了
- 不用static,巧用对象.方法调用java中的函数
- 创建一个 scrapy 爬虫项目
- 【足迹C++primer】51、面向对象编程概述
- Keras中那些学习率衰减策略
- 在苹果Macbook Pro上安装Windows 7
- qconshanghai2015
- 男生说fb是什么梗_男生聊污是什么意思 男生会对谁聊污
- 建网站如何选择空间?
- 【CodeForces 574B】Bear and Three Musketeers
热门文章
- python读写文件函数_Python开发【第三篇】:函数读写文件
- 全国二级 mysql有用_2020年全国计算机二级MySQL复习知识点:调整服务器
- linux内核维护者,Linux 内核维护者封杀明尼苏达大学(转载) - 优秀的Free OS(Linux)版 - 北大未名BBS...
- 洛谷——P1146 硬币翻转
- 中如何设置电气栅格_游戏中的设置界面如何设计?
- Struct嵌套使用
- Unity ToLua 中Update的调用流程
- 4.2 js没有块级作用域
- RequestsLibrary库入门介绍
- [转]busybox登陆后没要求输入密码的解决办法