Interrupt中断线程注意点
首先我们要明确,线程中断并不会使线程立即退出,而是发送一个通知,告知目标线程你该退出了,但是后面如何处理,则完全有目标线程自行决定。
这就是和stop()不一样的地方,stop执行后线程会立即终止,这样可能会引起数据不一致的问题(所以stop()方法已经被废弃不推荐使用了)。
线程中断有三个方法
public void Thread.interrupt(); //中断线程,设置中断标志位
public void Thread.isInterrupted(); //判断是否被中断
public void Thread.interrupted(); //判断是否被中断,并清除当前中断状态
先看下面一段代码
public class InterruptThread { public static void main(String[] args) throws Exception {
Thread thread = new Thread() {
public void run() {
while (true) {
Thread.yield();
}
}
};
thread.start();
Thread.sleep(2000);
thread.interrupt();// 设置中断标志位
}
}
虽然对thread进行了中断,但是thread并没有中断处理逻辑,所以这个中断就不起作用,否则,中断就和stop没什么两样了。
再看下面的代码
package com.thread.test; public class InterruptThread { public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread() {
public void run() {
while (true) {
//Thread.currentThread().isInterrupted();检查中断标志位--检查线程是否有被中断
if (Thread.currentThread().isInterrupted()) {
System.out.println("被中断了");
break;
}
Thread.yield();
}
};
};
thread.start();
Thread.sleep(2000);
thread.interrupt();//设置中断标志位
} }
isInterrupted()用于判断线程是否被中断,如果被中断则退出循环体。
请注意,代码中sleep()方法总会抛出一个InterruptedException中断异常,它不是运行时异常,因此我们必须捕获它并处理,当线程在睡眠的时候如果被中断,这个异常就会产生
请看以下代码
package com.thread.test; public class InterruptThread { public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread() {
public void run() {
while (true) {
System.out.println("未被中断");
//Thread.currentThread().isInterrupted();检查中断标志位--检查线程是否有被中断
if (Thread.currentThread().isInterrupted()) {
System.out.println("被中断了");
break;
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.err.println("睡眠时发生了中断异常");
Thread.currentThread().interrupt();//设置中断标志位
}
Thread.yield();
}
};
};
thread.start();
Thread.sleep(2000);
thread.interrupt();//设置中断标志位
} }
运行后输出结果为:
未被中断
睡眠时发生了中断异常
未被中断
被中断了
注意:sleep()方法由于中断而抛出异常,此时,它会清除中断标记,如果不加以处理,那么下一次循环开始时,就无法捕获这个中断,故在异常处理中,再次设置中断标记位
如果不再次设置,则会输出如下结果:
未被中断
睡眠时发生了中断异常
未被中断
未被中断
未被中断
未被中断
.......
...
.
Interrupt中断线程注意点的更多相关文章
- Interrupt中断线程
package com.wistron.swpc.ecs.util; public class WrongWayStopThread extends Thread{ public static voi ...
- 注意Thread.interrupt()方法的真正作用并不是用来中断线程
程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误. 在本篇文章中,我们针对这些难题之一:如何中断一个正在 ...
- 用interrupt()中断Java线程
最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正. 假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢? class ATas ...
- 中断线程Interrupt()
以下是参考<<Java多线程模式>>的 1. sleep() & interrupt() 线程A正在使用sleep()暂停着: Thread.sleep(100000) ...
- 并发和多线程(二)--启动和中断线程(Interrupt)的正确姿势
启动线程: 从一个最基本的面试题开始,启动线程到底是start()还是run()? Runnable runnable = () -> System.out.println(Thread.cur ...
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...
- java多线程系类:基础篇:09之interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于"阻塞状态"的线程2.2 ...
- 如何实现Android 中断线程的处理
我现在对一个用户注册的功能1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog)2.用一个线程clientThread执行数据的提交和返回 问题:考虑 ...
- Android 中断线程的处理
我现在对一个用户注册的功能1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog)2.用一个线程clientThread执行数据的提交和返回 问题:考虑 ...
随机推荐
- Android 开发工具类 18_NetWorkUtil
检测网络的一个工具包: 1.网络是否可用: 2.判断是否有网络连接: 3.判断 WIFI 网络是否可用: 4.判断 MOBILE 网络是否可用; 5.获取当前网络连接的类型信息: 6.获取当前的网络状 ...
- MyEclipse 新手使用教程---图文详解
引言 某天在群里看到有小伙伴问MyEclipse/Eclipse的一些使用问题,虽然在我看来,问的问题很简单,但是如果对于刚刚学习的人来说,可能使用就不那么友好了.毕竟我在开始使用MyEclipse/ ...
- 手把手教你如何优雅的使用Aop记录带参数的复杂Web接口日志
前言 不久前,因为需求的原因,需要实现一个操作日志.几乎每一个接口被调用后,都要记录一条跟这个参数挂钩的特定的日志到数据库.举个例子,就比如禁言操作,日志中需要记录因为什么禁言,被禁言的人的id和各种 ...
- 15-Flink实战项目之实时热销排行
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...
- angr进阶(4)从任意位置开始
从程序的任意位置开始可以大大的减少测试的时间,使用的方法是控制程序运行到某时刻的寄存器的值来进行的.asisctffinals2015_fake p = angr.Project("fake ...
- 【野草】SQL Server之索引解析(二)
1.堆表 堆表通过IAM连接一起,查询时全表扫描. 1.1 非聚集索引 结构 叶子节点数据结构:行数据结构+Rid(8字节) 中间节点数据结构: (非聚集非唯一索引)行数据结构+Page(4)+2+ ...
- Wcf传递的参数实际不为空,但是接收时显示为空。
问题原因:参数大小写不一致引起,服务端接收参数为空 客户端引用 服务端定义
- java集合架构
Collection接口 与 Map接口 1 .collection接口 特点:元素是 无序可重复的集合,无索引的,元素是单例值 子类 :set接口 list接口 1.1 set接口 特点: ...
- java多线程中的三种特性
java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...
- 《React设计模式与最佳实践》笔记
书里的demo都是15.3.2以下版本的,有些demo用最新的react 16.x版本会报错,安装包的时候记得改一下版本 第一章 React 基础 命令式编程描述代码如何工作,而声明式编程则表明想 ...