/**
*isInterrupted
*/
public class InterruptDemo {
public static void main(String[] args) throws InterruptedException{
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()){
System.out.println(Thread.currentThread()+"没被中断");
}
}
});
thread.start();
Thread.sleep(1000);
System.out.println("main thread interrupt thread");
thread.interrupt();
thread.join();
System.out.println("main is over");
//...
//Thread[Thread-0,5,main]没被中断
//Thread[Thread-0,5,main]没被中断
//Thread[Thread-0,5,main]没被中断
//Thread[Thread-0,5,main]没被中断
//Thread[Thread-0,5,main]没被中断
//main thread interrupt thread
//Thread[Thread-0,5,main]没被中断
//main is over
}
}
/**
* interrupt()方法打断线程的休眠
*/
public class InterruptDemo2 {
public static void main(String[] args) throws InterruptedException{
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("threadOne begin sleep for 200 s");
Thread.sleep(200000);
System.out.println("threadOne waking");
} catch (InterruptedException e) {
System.out.println("threadOne is interrupted while sleeping");
return;
}
System.out.println("threadOne-leaving normally");
}
});
threadOne.start();
//确保子线程进入休眠状态
Thread.sleep(1000);
//打断子线程的休眠,让子线程从sleep函数返回
threadOne.interrupt();
//等待子线程执行完毕
threadOne.join();
System.out.println("main thread is over");
//threadOne begin sleep for 200 s
//threadOne is interrupted while sleeping
//main thread is over
// threadOne 线程休眠了200s,在正常情况下该线程需要等到 200s 后才会被唤醒,
// 但是通过调用 threadOne.interrupt()方法打断了该线程的休眠,
// 该线程会在调用 sleep 方法处抛出 InterruptedException 异常后返回 }
}
/**
* interrupted() 与 isInterrupted()
*/
public class InterruptDemo3 {
public static void main(String[] args) throws InterruptedException{
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
while (true){}
}
});
threadOne.start();
threadOne.interrupt();
System.out.println("isInterrupted:"+threadOne.isInterrupted());
System.out.println("isInterrupted:"+threadOne.interrupted());
System.out.println("isInterrupted:"+Thread.interrupted());
System.out.println("isInterrupted:"+threadOne.isInterrupted());
threadOne.join();
System.out.println("main thread is over");
//isInterrupted:true
//isInterrupted:false
//isInterrupted:false
//isInterrupted:true
// 在 interrupted()内部是获取当前调用线程的中断标志而不是调用 interrupted()方法的实例对象的中断标志。
// public static boolean interrupted() {
// return currentThread().isInterrupted(true);
// }
//在 interrupted()方法内部是获取当前线程的中断状态,这里虽然调用了 threadOne 的 interrupted() 方法,
//但是获取的是主线程的中断标志,因为主线程是 当前线程。 threadOne.interrupted()和 Thread.interrupted()方法的作用是一样的,
// 目的都是 获取当前线程的中断标志
}
}
/**
* interrupted()
*/
public class InterruptDemo4 {
public static void main(String[] args) throws InterruptedException{
Thread threadOne = new Thread(new Runnable(){
@Override
public void run() {
//中断标志为true时会退出循环,并清除中断标志
while (!Thread.currentThread().interrupted()){}
System.out.println("threadOne interrupted:"+Thread.currentThread().isInterrupted());
}
});
threadOne.start();
threadOne.interrupt();
threadOne.join();
System.out.println("main thread is over");
//threadOne interrupted:false
//main thread is over
}
}

补充案例:

public class InterruptTest01 {
public static void main(String[] args) throws InterruptedException{
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println("hello");
Thread.yield();
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println("hello");
if (Thread.currentThread().isInterrupted()){
System.out.println("中断...");
break;
}
Thread.yield();
}
}
});
// thread.start();
// Thread.sleep(2000);
// thread.interrupt();
//hello
//hello
//hello
//hello
//hello
//hello
//hello
//...
//虽然对thread进行了中断,但在thread中没有中断处理逻辑,因此,即使thread被置上了中断状态,也不会发生任何作用 // thread2.start();
// Thread.sleep(1000);
// thread2.interrupt();
//hello
//hello
//hello
//hello
//hello
//hello
//中断...
//在循环体中,出现类似于wait(),sleep()这样的操作,则只能通过中断来识别了
//sleep()会抛出InterruptedException,当线程在sleep时被中断,就会产生这个异常 Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println("hello");
if (Thread.currentThread().isInterrupted()){
System.out.println("中断...");
break;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// e.printStackTrace();
//加处理
System.out.println("处理异常");
Thread.currentThread().interrupt(); //再次中断自己,置上中断标记位
}
Thread.yield();
}
}
});
thread3.start();
Thread.sleep(1000);
thread3.interrupt();
//hello
//hello
//hello
//hello
//hello
//hello
//java.lang.InterruptedException: sleep interrupted
// at java.lang.Thread.sleep(Native Method)
// at com.combat.InterruptTest01$3.run(InterruptTest01.java:63)
// at java.lang.Thread.run(Thread.java:748)
//hello
//hello
//hello //Thread.sleep()方法由于中断而抛出异常,她会清除中断标记,不加处理,那么下次循环就无法捕获这个中断
//处理后结果
//hello
//hello
//hello
//hello
//hello
//hello
//hello
//hello
//hello
//处理异常
//hello
//中断...
}
}

07.interrupt的更多相关文章

  1. Samsung_tiny4412(驱动笔记07)----spinlock,semaphore,atomic,mutex,completion,interrupt

    /*********************************************************************************** * * spinlock,se ...

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

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

  3. u-boot-2016.07 README文档结构

    Author:AP0904225版权声明:本文为博主原创文章,转载请标明出处. 阅读u-boot的README文档,可以获取很多有用的信息,例如从哪里可以获得帮助,帮助:u-boot版本命名规则,目录 ...

  4. Reentrant protected mode kernel using virtual 8086 mode interrupt service routines

    A method for allowing a protected mode kernel to service, in virtual 8086 mode, hardware interrupts ...

  5. IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表

    原文:  IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表 IDT,Interrupt Descriptor Table,中断描述符表是CPU用来处理中 ...

  6. java中interrupt,interrupted和isInterrupted的区别

    文章目录 isInterrupted interrupted interrupt java中interrupt,interrupted和isInterrupted的区别 前面的文章我们讲到了调用int ...

  7. 第07课:GDB 常用命令详解(下)

    本课的核心内容: disassemble 命令 set args 和 show args 命令 tbreak 命令 watch 命令 display 命令 disassemble 命令 当进行一些高级 ...

  8. Windows内核中的CPU架构-6-中断门(32-Bit Interrupt Gate)

    Windows内核中的CPU架构-6-中断门(32-Bit Interrupt Gate) 中断门和调用门类似,也是一种系统段.同样的它也可以用来提权. 中断门: 虽然中断门的段描述符如下: 但是中断 ...

  9. iOS系列 基础篇 07 Action动作和输出口

    iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...

随机推荐

  1. python运行windows终端程序

    其实是用python控制windows里的shell 1.windows有PowerShell,可以通过搜索打开,运行python不需要打开shell 2.用python里的subprocess函数, ...

  2. zoj 3325 Machine(线段树)

    题意:0~n-1的数组,初始值为0:执行m个操作,每次操作执行后输出当前值为0的连续段的段数. 操作1: p i j : i~j区间的每个元素值减1 操作2: r i j :i~j区间的每个元素值加1 ...

  3. oracle中分页函数写法

    1.常见的分页查询语句: 查询21到40条之间的数据:SELECT *FROM (select UI.*,ROWNUM RN FROM (select * from user_info) AWHERE ...

  4. solr测试用的配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  5. SGU 176 (有源汇最小流)

    转载:http://blog.csdn.net/dan__ge/article/details/51207951 题意:n个节点,m条路径,接下来m行a,b,c,d,如果d等于1,则a到b的流量必须为 ...

  6. NOIP day1 玩具谜题

    逻辑有一些复杂,但是理解之后就很简单.题目描述中mogician什么的太暴力了...-1s 按照题目描述模拟,就能满分. /* Au: GG * CCF NOIP2016 day1 * toy */ ...

  7. 1.OpenCV数据类型

    基础类型 1.模板类cv::Vec<> 固定向量类,维度已知的小型向量——处理效率高 2.cv::Point类(Point2i,Point2f,Point2d;Point3i,Point3 ...

  8. 用webdriver模仿浏览器 爬取豆瓣python书单

    用webdriver模仿浏览器 爬取豆瓣python书单 其中运用到os 模块 作用是生成文件夹 存储爬取的信息 etree 用于xpath解析内容 详细代码如下 可用我的上一篇博客存取到excel当 ...

  9. DOM操作 、js获取id的内容 和修改原来的内容(innerHTML)

    js获取id的内容(getElementById) 和修改原来的内容(innerHTML) 1.通过ID获取元素 学过HTML/CSS样式,都知道,网页由标签将信息组织起来,而标签的id属性值是唯一的 ...

  10. vue项目中路由验证和相应拦截的使用

    详解Vue路由钩子及应用场景(小结):https://www.jb51.net/article/127678.htm vue项目中路由验证和相应拦截的使用:https://blog.csdn.net/ ...