Java多线程系列 基础篇04 线程中断
1. 中断线程
中断可以理解为线程的一个标志位属性,它表示一个运行中的线程是否被其他线程进行了中断操作,其他线程通过调用该线程的interrupt()方法对其进行中断操作,线程通过检查自身是否被中断来进行响应,线程通过方法isInterrupt()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标志位进行复位,如果该线程已经处于终结状态,即使该线程被中断过,在调用该线程对象的isInterrupted()时依旧会返回false。
2. 终止处于“阻塞状态”的线程和终止处于“运行状态”的线程
/**
* @Description: 线程中断示例
* @Author: lizhouwei
* @CreateDate: 2018/5/20 21:11
* @Modified By:
*/
public class ThreadInterruptDemo {
public static void main(String[] args) {
//sleepThread线程不停的尝试睡眠
Thread sleepThread = new Thread(new SleepRunner(), "sleepThread");
sleepThread.setDaemon(true);
//busyThread不停的运行
Thread busyThread = new Thread(new BusyRunner(), "busyThread");
busyThread.setDaemon(true);
sleepThread.start();
busyThread.start();
//主线程睡眠5秒,让sleepThread 和busyThread 充分的运行
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
sleepThread.interrupt();//中断阻塞的线程
busyThread.interrupt();//中断正在运行的线程
System.out.println("sleepThread interrupt is " + sleepThread.isInterrupted());
System.out.println("busyThread interrupt is " + busyThread.isInterrupted());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("1");
e.printStackTrace();
}
}
static class SleepRunner implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class BusyRunner implements Runnable {
@Override
public void run() {
while (true) {
}
}
}
}

从结果可以看出,抛出InterruptException 的是被阻塞的线程SleepThread,其中断标志先被设置为true,随后被复位并抛出异常,而正在运行的线程BusyThread,中断标志位没有没被清除。
安全的终止线程
除了使用中断以外,还可以利用一个boolean变量来控制十五终止该线程。
代码示例:
/**
* @Description: 使用boolean变量安全的终止线程
* @Author: lizhouwei
* @CreateDate: 2018/7/1 20:56
* @Modified By:
*/
public class ThreadShutdownDemo {
public static void main(String[] args) {
Runner oneRunner = new Runner();
Thread oneThread = new Thread(oneRunner, "oneThread");
oneThread.start();
//主线程睡眠1秒,主线程对oneThread 线程进行中断,使oneThread能够感知中断而结束
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
oneThread.interrupt();
Runner twoRunner = new Runner();
Thread twoThread = new Thread(twoRunner, "twoThread");
twoThread.start();
//主线程睡眠1秒,主线程对twoThread 线程进行中断,使twoThread能够感知中断而结束
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
twoRunner.cancel();
}
private static class Runner implements Runnable {
private long i;
private volatile boolean running = true;
@Override
public void run() {
while (running && !Thread.currentThread().isInterrupted()) {
i++;
}
System.out.println("count i = " + i);
}
public void cancel() {
running = false;
}
}
}
运行结果

Java多线程系列 基础篇04 线程中断的更多相关文章
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
- Java多线程系列 基础篇02 线程的创建和运行
1.线程创建的方式常用有两种 1. 继承 Thread 类创建线程 2. 实现 Runnable 接口创建线程 2.Thread 和 Runnable的区别 Thread和Runnable的相同点:都 ...
- Java多线程系列 基础篇01 线程的状态
1.进程和线程 进程: 计算机中程序关于某数据集合的一次运行活动,是计算机系统进行资源分配和调度的基本单位,是操作系统结构的基础. 线程: 线程是进程的实例,是CPU进行资源分配和调度的最小单位,线程 ...
- Java多线程系列 基础篇03 线程的优先级和守护线程
1. 线程优先级 现代操作系统中基本上使用时间分片的方式调度线程,通过设置线程优先级,使优先级高的线程获得时间片的次数多于优先级低的线程. 在java 线程中,通过一个整形变量prority来控制优先 ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- Java多线程系列--“基础篇”07之 线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
随机推荐
- Cocos2d-x学习笔记(四) 布景层的加入移除
布景层类也就是CCLayer类,每一个游戏场景中都能够有非常多层,每一层负责各自的任务.显示地图.显示人物等.同一时候层还是一个容器,能够放入文本.图片和菜单.构成游戏中一个个UI.这次将学习在场景中 ...
- Flume 开发人员指南V1.5.2
介绍 概述 Apache Flume是一个用来从非常多不同的源有效地收集.聚集和移动大量的日志数据到一个中心数据仓库的分布式的,可靠的和可用的系统. Apache Flume是Apache软件基金会的 ...
- 各类免费的API接口分享,无限次
各类免费的API接口分享: 手机号码归属地API:https://www.juhe.cn/docs/api/id/11 历史上的今天API:https://www.juhe.cn/docs/api/i ...
- JQuery中$.get(),$.post(),$.ajax(),$.getJSON()的区别
详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON() 一.$.get(url,[data],[callback]) 说明:url为请求地址,d ...
- project修改时间日历
视图→甘特图 格式→时间表→右键时间表 详细的日程表,然后双击时间即可
- Node.js学习笔记(2)——关于异步编程风格
Node.js的异步编程风格是它的一大特点,在代码中就是体现在回调中. 首先是代码的顺序执行: function heavyCompute(n, callback) { var count = 0, ...
- 创业神人&当时钢铁侠:Elon Musk
Steve Jobs的光环已经随着他的离去而淡褪,短期内,世上恐怕再难有人像他这样惊世骇俗般的改变了世界.但是如果你了解到一个人,一个来自南非年仅40岁的企业家,在短短的20年里,在全世界最酷的三个领 ...
- CocoaPods安装教程 pod setup很慢解决方案
CocoaPods安装教程 pod setup很慢解决方案 http://www.jianshu.com/p/6230eec137f6
- OpenSUSE 13.1上安装StrongSwan
结果: 1)iOS 7.1设备能够拨IPSec VPN到StrongSwan电脑上面来 - Connect to VPN 2)iOS 设备浏览器能够訪问StrongSwan VPN所在的内网地址服务器 ...
- 一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬
消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑.再不然就是和运营聊聊天,写几个SQL, ...