java源码中interrupt函数的定义:
public void interrupt() {
if (this != Thread.currentThread())
checkAccess();
synchronized (blockerLock) {
Interruptible b = blocker;
if (b != null) {
interrupt0(); // Just to set the interrupt flag
b.interrupt(this);
return;
}
}
interrupt0();
}
对java中断的真确定位和使用
在java中的中断interrupt,仅仅只是一种标志状态,即其仅用逻辑值表示,true 和 false ,在默认情况下是false意思是非中断状态,java源码希望利用此中断状态可以让程序员自己控制线程的执行,即中断状态不会影响线程的执行,线程该干嘛还是干嘛。可以理解为java的中断控制不了cpu,它仅有名词含义。
若是我们调用线程的中断方法,当程序即将进入或是已经进入阻塞调用的时候,那么这个中断信号应该由InterruptedException捕获并进行重置,但此也是源码设计好的,跟真正停止程序的运行没有一丁点关系,然而我们仅仅在有必要的时候处理此InterruptedException所对应的操作;当run()方法程序段中不会出现阻塞操作的时候,这时候中断并不会抛出异常,我们需要通过interrupted()方法进行中断检查和中断标志的重置。另外,知道IO操作和synchronized上的阻塞不可中断也是必要的。
下面通过代码和注释解释说明
package com.myThread;
public class TextForInterrupt extends Thread {
public static void main(String[] args){
TextForInterrupt textForInterrupt = new TextForInterrupt();
textForInterrupt.start(); //启动线程,进入Runable
//textForInterrupt.interrupt();
}
//我们只需把注意里集中到run()函数上
public void run(){
for (int i = 0; i <= 9; ++i) {
try {
sleep(2000); //先延迟2秒,此延迟通过线程阻塞实现,即最少再次执行此线程需要2秒之后
interrupt(); //设置中断异常为true,则在此状态下下次执行sleep()函数时,会抛出中断异常
} catch (InterruptedException e) {
//抛出中断异常之后,其结果之一便是中断标志重置为false,在此try结构中,出现此异常的唯一可能是
//线程的中断状态为true,而执行了造成线程阻塞的语句
//下面可以自定义更多语句
System.out.println("出现中断异常");
}
System.out.println(Thread.currentThread().isInterrupted()); //输出此时的中断状态
System.out.println(i); //显示第几次循环
/*
* 当一个线程被设为中断标志为true时,再调用sleep()让其处于阻塞等待队列时,会产生一个中断异常。
* 获取中断异常的结果之一就是让中断标志回归false,其他目的有程序员自定义。
* 并且不会改变阻塞的状态。
* */
}
}
}
}
程序运行结果为:并对其解释说明
D:\Java\jdk-10.0.1\bin\java.exe "-javaagent:D:\IntelliJ IDEA Community Edition 2018.1.3\lib\idea_rt.jar=64316:D:\IntelliJ IDEA Community Edition 2018.1.3\bin" -Dfile.encoding=UTF-8 -classpath E:\javaproject\chapter08\out\production\chapter08 com.myThread.TextForInterrupt
true //等待2秒输出前面两行的同时有再输出两行,此行的结果为true是由于次语句 interrupt();
0
出现中断异常 //之所以此行紧跟着上面一行无延迟输出是因为,在中断状态为true的情况下,执行sleep(2000),
//会抛出InterruptedException异常,由于被catch捕获,所以直接跳到catch语句块,不执
//sleep(2000)该有的延迟,并 中断标志被重置为false,所以输出下面一行的结果
false
1
true //上面输出完后继续等待两秒,由此开始和上面的输出结果及原因一样
2
出现中断异常
false
3
true
4
出现中断异常
false
5
true
6
出现中断异常
false
7
true
8
出现中断异常
false
9
Process finished with exit code 0
注意下面三个函数的用法: Interrupt() :此函数运行的唯一结果是将中断标志设置为true。
interrupted() : 此函数首先返回当前的中断标志状态,即返回 true 或者 false ,然后再将中断状态重置为 false ,
isInterrupted() : 此函数返回当前中断状态,即返回 true 或者 false。