首先我们要明确,线程中断并不会使线程立即退出,而是发送一个通知,告知目标线程你该退出了,但是后面如何处理,则完全有目标线程自行决定。

这就是和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中断线程注意点的更多相关文章

  1. Interrupt中断线程

    package com.wistron.swpc.ecs.util; public class WrongWayStopThread extends Thread{ public static voi ...

  2. 注意Thread.interrupt()方法的真正作用并不是用来中断线程

      程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.      在本篇文章中,我们针对这些难题之一:如何中断一个正在 ...

  3. 用interrupt()中断Java线程

    最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正. 假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢? class ATas ...

  4. 中断线程Interrupt()

    以下是参考<<Java多线程模式>>的 1. sleep() & interrupt() 线程A正在使用sleep()暂停着: Thread.sleep(100000) ...

  5. 并发和多线程(二)--启动和中断线程(Interrupt)的正确姿势

    启动线程: 从一个最基本的面试题开始,启动线程到底是start()还是run()? Runnable runnable = () -> System.out.println(Thread.cur ...

  6. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...

  7. java多线程系类:基础篇:09之interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于"阻塞状态"的线程2.2 ...

  8. 如何实现Android 中断线程的处理

    我现在对一个用户注册的功能1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog)2.用一个线程clientThread执行数据的提交和返回 问题:考虑 ...

  9. Android 中断线程的处理

    我现在对一个用户注册的功能1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog)2.用一个线程clientThread执行数据的提交和返回 问题:考虑 ...

随机推荐

  1. ASP.NET MVC one view bind many model

    一.自定义视图模型 model.cs public class AorBvm { public List<Role> GetRole { get; set; } public List&l ...

  2. 『ice 离散化广搜』

    ice(USACO) Description Bessie 在一个冰封的湖面上游泳,湖面可以表示为二维的平面,坐标范围是-1,000,000,000..1,000,000,000. 湖面上的N(1 & ...

  3. 面向切面编程 ( Aspect Oriented Programming with Spring )

    Aspect Oriented Programming with Spring 1. 简介 AOP是与OOP不同的一种程序结构.在OOP编程中,模块的单位是class(类):然而,在AOP编程中模块的 ...

  4. redis 系列17 持久化 AOF

    一.概述 除了上篇介绍的RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能.与RDB保存数据库中的键值对来记录数据库状态不同,AOF是通过保存redis服务器 ...

  5. IntelliJ IDEA 导入新项目

    在现有的idea中close project 关闭当前项目, 然后import project

  6. RabbitMQ消息队列(十一)-如何实现高可用

    在前面讲到了RabbitMQ高可用集群的搭建,但是我们知道只是集群的高可用并不能保证应用在使用消息队列时完全没有问题,例如如果应用连接的RabbitMQ集群突然宕机了,虽然这个集群时可以使用的,但是应 ...

  7. 我和Session的不解之“缘”(故事型技术长文)

    本文讲述了一路走来对Session的认知.文章有点长,不过是故事型的,应该不枯燥.相信读完也一定会有所收获. (一) “当你登陆系统后,服务器会创建一个Session,保存你的登陆信息,下次再访问时就 ...

  8. 阿里云弹性容器实例产品 ECI ——云原生时代的基础设施

    阿里云弹性容器实例产品 ECI ——云原生时代的基础设施 1. 什么是 ECI 弹性容器实例 ECI (Elastic Container Instance) 是阿里云在云原生时代为用户提供的基础计算 ...

  9. Zabbix监控原理及架构

    什么是Zabbix? Zabbix是一个用于网络,操作系统和应用程序的开源监控软件,它旨在监视和跟踪各种网络服务,服务器和其他网络硬件的状态. 为什么需要对各类系统进行监控? 在系统构建时的正常流程中 ...

  10. .NET读取json数据并绑定到对象

    需要引用的命名空间: 读取的具体应用: this代表本实体(对象),通过PopulateObject,直接将读取到的json数据与对象进行绑定 Json保存的具体应用: 将对象保存为Json JObj ...