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中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,它只是要求被中断线程在合适的时机中断自己,这需要被中断的线程自己处理中断.这好比是家里的父母叮嘱在外的子女要注意身体,但子女是 ...
随机推荐
- 第2课第1节_Java面向对象编程_类的引入_P【学习笔记】
摘要:韦东山android视频学习笔记 1. 面向对象编程的引入,我们先写一个简单的程序输出张三,李四的名字.代码如下,假如,现在我们要在名字前面添加籍贯广东,那样岂不是每个printf语句都得修改添 ...
- Socket: java Socket的isConnected()、和isClosed()判断是否在线的问题(转)
首先,很多初学者都会用这两个API来判断对方是否在线,但是经过我的实践,此API并不能实时判断是否在线的状态. 经过百度查询资料后,得出结论: 事实上这些方法都是访问socket在内存驻留的状态,当s ...
- Android页面切换
参考地址: http://www.crifan.com/android_how_to_create_new_ui_and_switch_to_another_new_ui/ 想要实现,在Android ...
- 在mac中安装tmux
在mac 中安装Tmux: 在终端输入如下命令: brew install tmux Tmux 的快捷键前缀(Prefix) 为了使自身的快捷键和其他软件的快捷键互不干扰,Tmux 提供了一个快捷键 ...
- Python中__new__和__init__的区别与联系
__new__ 负责对象的创建而 __init__ 负责对象的初始化. __new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回 ...
- PHP 小程序发模板消息
记录一下DEMO <?php function getAccessToken ($appid, $appsecret) { $url='https://api.weixin.qq.com/cgi ...
- WPF ChromiumWebBrowser 网页背景透明
网页中添加下面样式即可: <style> html, body { margin: 0px; height: %; width: %; overflow: hidden; backgrou ...
- 003-结构型-02-装饰模式(Decorator)
一.概述 装饰( Decorator )模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案.他是23种设计模式之一,英文叫Decorator Pattern,又叫 ...
- 转 ORA-13541: system moving window baseline size (691200) greater than retention (432000)
修改awr生成报告时间间隔和保存时间时报错,由默认的每小时生成,保存8天修改为每半个小时生成一次,保存5天: SQL> exec dbms_workload_repository.modify_ ...
- shell脚本中执行mysql sql脚本文件并传递参数
1 shell 文件内容替换 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法. 调用sed命 ...