Thread interrupted() 线程的中断
问题:
1、线程的中断方式。
2、为什么中断阻塞中的线程,会抛出异常。
代码示例:
package com.hdwl.netty;
public class ThreadInterrupted {
public static void main(String[] args) {
// testNoInterrupted();
// testInterrupted();
testInterruptedWithBlock();
}
//测试阻塞线程的中断
private static void testInterruptedWithBlock() {
MyInterruptedBlockThread mibt = new MyInterruptedBlockThread();
mibt.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mibt.interrupt();//设置中断标示
}
//线程非阻塞中断的演示
private static void testInterrupted() {
MyInterruptedNoBlockThread mibt = new MyInterruptedNoBlockThread();
mibt.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mibt.interrupt();//设置线程中断标示
}
//不中断线程的演示,由于未设置中断标示,所有线程永远不会中断。
private static void testNoInterrupted() {
MyInterruptedNoBlockThread mibt = new MyInterruptedNoBlockThread();
mibt.start();
}
}
//阻塞线程
class MyInterruptedBlockThread extends Thread{
@Override
public void run() {
//如果线程中断位置为true,则结束while循环
while (!isInterrupted()){
System.out.println("running……");
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
//当阻塞中的线程被中断,线程的中断标示被重置,所以需要重新设置
interrupt();
}
}
System.out.println("线程结束!");
}
}
//非阻塞线程
class MyInterruptedNoBlockThread extends Thread{
@Override
public void run() {
//如果线程中断位置为true,则结束while循环
while (!isInterrupted()){
System.out.println("running……");
}
System.out.println("线程结束!");
}
}
解答问题:
1、线程的中断,使用设置中断标示的方式进行。
2、中断阻塞中的线程抛出异常,是为了不让线程无休止的中断。因为设置中断标示,线程并不会马上停止,还需要等待下一次的CPU时间片到来,才能根据interrupted方法的返回值来终止线程。如果某个阻塞线程B,依赖于线程A的notify(或者其它操作,才能唤醒线程B),那么将线程A,B同时设置为中断标示,此时线程A已经死亡了,而线程B还一直等到唤醒,才能根据interrupted方法,进行线程的中断操作。因此,中断阻塞中的线程,必须抛出异常,方便我们进行后续的处理。
Thread interrupted() 线程的中断的更多相关文章
- 线程的中断(Lock与synchronized)
Thread包含interrupt()方法,因此你可以终止被阻塞的任务,这个方法将设置线程的中断状态.如果一个线程已经被阻塞,或者试图执行一个阻塞操作.那么设置这个线程的中断状态将 抛出Interru ...
- 理解java线程的中断(interrupt)
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等. 所以你看到Thread.suspend, Threa ...
- Java Thread.interrupt 害人! 中断JAVA线程(zz)
http://www.blogjava.net/jinfeng_wang/archive/2012/04/22/196477.html#376322 ————————————————————————— ...
- boost::thread编程-线程中断(转)
原文转自 http://blog.csdn.net/anda0109/article/details/41943691 thread的成员函数interrupt()允许正在执行的线程被中断,被中断的线 ...
- Thread interrupt() 线程中断的详细说明
GitHub源码地址 原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止 ...
- 2015年11月25 Java基础系列(二)Thread Runnable线程初级讲解
序,线程是比进程小的进程,非常广泛的被使用. 一.继承Thread实现线程操作 1.注意setDaemon(boolean)方法,参数为true时为守护线程,参数为false时为用户线程. 守护线程的 ...
- 从JDK源码角度看java并发线程的中断
线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止.在java中要让线程安全.快速.可靠 ...
- Java线程的中断(Interruption)
任务和线程的启动很容易.在大多数时候,我们都会让它们运行直到结束,或者让它们自行停止.然而,有时候我们希望提前结束任务或线程,或许是因为用户取消了操作,或者应用程序需要被快速关闭. 要使任务和线程能安 ...
- Thread之八:interrupt中断
Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,它只是要求被中断线程在合适的时机中断自己,这需要被中断的线程自己处理中断.这好比是家里的父母叮嘱在外的子女要注意身体,但子女是 ...
随机推荐
- outlook alias
Add an email address Go to Add an alias. Sign in to your Microsoft account, if prompted. Under Add a ...
- nodejs五子棋online游戏开发视频教程,客户端cocos creator js
开发的游戏是五子棋online,网络版的,服务端部分和客户端部分都在这个教程里面,可以看一下目录! 服务器nodejs游戏开发教程 使用Nodejs开发网络服务器 游戏服务端 ,cocos creat ...
- Flink 之 写入数据到 ElasticSearch
前面 FLink 的文章中我们已经介绍了说 Flink 已经有很多自带的 Connector. 1.<从0到1学习Flink>—— Data Source 介绍 2.<从0到1学习F ...
- python获取公网ip的几种方式
python获取公网ip的几种方式 转 https://blog.csdn.net/conquerwave/article/details/77666226 from urllib2 import u ...
- 软件定义网络基础---SDN数据平面
主要介绍SDN架构和转发模型 一:传统网络设备 (一)传统设备控制平面和数据平面 (二)数据平面的任务 数据平面对数据包的处理,主要通过查询由控制平面所生成的转发信息表来完成 (三)传统网络数据平面数 ...
- Glide图片加载过程(简)
iceIC 关注 2018.10.25 20:53* 字数 906 阅读 529评论 0喜欢 1 调研版本为4.7.1为了更加简单的理解,会将函数代码简化,详细代码请自行照源码对比 Glide用法 G ...
- java使用Sonic 算法对音频变速不变声、变调、调整音量
依赖库:https://github.com/waywardgeek/sonic 基础库:Sonic.java /* Sonic library Copyright 2010, 2011 Bill C ...
- 【缺少kubernetes权限】 namespaces "xxx" is forbidden: User "xxx" cannot xxx resource "xxx" in API group "xxx" in the namespace "xxx"
需要添加权限,添加权限方式: https://github.com/argoproj/argo/issues/1068
- C#中Request.servervariables参数
整理一下,我在asp.net下遍历的Request.servervariables这上集合,得出的所有参数如下: : Request.ServerVariables["ALL_HTTP&qu ...
- 【Leetcode_easy】942. DI String Match
problem 942. DI String Match 参考 1. Leetcode_easy_942. DI String Match; 完