/**
*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已处理的异常

    字符串比较中,如果一个字符串有内容,另一个没有内容,python不会报错,而是认为两个字符串不相同如 a=" b="" if a[4:5]==b[4:5]: print( ...

  2. Android自动化测试框架UIAutomator原理浅析

    UIAutomator是一个Android自动化测试框架,是谷歌在Android4.1版本发布时推出的一款用Java编写的UI测试框架,它只能用于UI即黑盒方面的测试.所以UIAutomator只能运 ...

  3. PCB底层打印到热转印纸上 Altium Designer

     切记:如果是TopLayer,应该勾选镜像打印(Mirror)  切记:底层Bottom Layer ,不勾选镜像

  4. 【Flutter学习】基本组件之弹窗和提示(SnackBar、BottomSheet、Dialog)

    一,概述 Flutter中的操作提示主要有这么几种 SnackBar.BottomSheet.Dialog,因为 Dialog样式比较多,放最后讲好了 二,介绍 SnackBar SnackBar的源 ...

  5. 5 August

    P1016 旅行家的预算 单调队列. 再看看单调队列怎么用的. #include <cstdio> int n, l, r; double D, dd, d[9], C, p[9], an ...

  6. 运行python不报错,运行pip报错

    Fatal error in launcher: Unable to create process using '""c:\program files (x86)\python36 ...

  7. 题解 P1017 【进制转换】

    我赶jio这个题难道是让我们写快写? 不管了,赶紧把咕咕咕了一万年的题解写出来. 这个题就是考察负进制和在mod意义下的除法运算的基础运算. (其实也没多大问题) 首先我们先假设一个原始数据\(num ...

  8. vmware导出OVF文件失败

    从VMware菜单栏选择导出到 .ovf. 显示导出失败 "Failed to open ..... .vmx". 尝试直接打开虚拟机,系统全部正常. 打开虚拟机所在目录,查找后缀 ...

  9. Python 进阶_生成器 & 生成器表达式

    目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...

  10. 查找android so文件中绕过c/c++ api直接调用SYSCALL的方法位置

    很多应用会通过arm汇编,自行调用syscall,直接操作系统内核,来绕过c层的hook,保证程序安全 所以想hook的话只能找到这些方法的c入口分别hook 可以通过查找bxls指令找到这些位置