结合interrupt state来理解interrupt
来源:互联网 发布:淘宝不能用ie8浏览器 编辑:程序博客网 时间:2024/05/28 03:03
Thread类的interrupt方法倒是见过好几次,但是一直不知道他的具体是干什么的,今天查了以下api和core java大概解决了自己的疑惑。(顺便吐槽一下core java的翻译,问题实在不少)。
以下是我总结出来的几点,仅供参考,如有错误之处,敬请指出。
1)线程的interrupt state可以通过Thread.currentThread.isInterrupted()来判断这个变量的真假,isInterrupt是一个实例方法,也可以通过线程实例来调用。
There is boolean flag in every thread that indicating the interrupt state,When the interrupt method is called on a thread, the interrupted status of the thread is set.
直译总感觉有点别扭,我还是意译一下吧:如果线程的interrupt方法被调用,那么线程的isInterrupted()返回值会为true,调用前是false;
运行以下代码,可以看到程序的输出会出现这种情况:首先为false,interrupt以后,变为true,但是程序依旧会输出0到9;
private void simpleInterrupt() {
Thread t = new Thread(){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
};
t.start();
System.out.println("before interrupt:" + t.isInterrupted());
t.interrupt();
System.out.println("after interrupt:" + t.isInterrupted());
}
由此可见,interrupt并不像它的中文意思中断一样能中断线程,但是改变了isInterrupted方法的返回值,这个还是可以作为run方法的循环结束的条件,从而中断线程,代码如下:
private void simpleInterruptAffect() {
Thread t = new Thread(){
@Override
public void run() {
for (int i = 0; i < 100 && !isInterrupted(); i++) {
System.out.println(i);
}
}
};
t.start();
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.interrupt();
}
多运行几遍,发现i没到99就结束了。
2)If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
当线程由于sleep或者wait等方法阻塞时,如果调用了interrupt方法,就会抛出一个异常(补充:core java上说是由于系统无法检测处于阻塞状态线程的interrupt state),并且清除掉线程的interrupt status(使得isInterrupted方法返回false),用代码验证一下
private void interruptSleep() {
Thread t1 = new Thread() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("interrupt status in catch:" + isInterrupted());
}
}
};
t1.start();
System.out.println("interrupt status before interrupt:" + t1.isInterrupted());
t1.interrupt();
System.out.println("interrupt status after interrupt:" + t1.isInterrupted());
}
一般会依次输出 interrupt status before interrupt:false
interrupt status after interrupt:true
interrupt status in catch:false
3)If you call the sleep method when the interrupted status is set, it doesn’t sleep. Instead, it
clears the status and throws an InterruptedException.
同样是意译:如果线程睡眠前线程它的isInterrupted返回true,线程就不会睡眠,相反,线程的会清除掉interrupt status并且抛出一个异常。同样用代码验证一下。
volatile boolean flag = false;
private void interruptThenSleep() {
Thread t = new Thread(){
@Override
public void run() {
while(!flag){}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("interrupt status in catch:" + isInterrupted());
}
}
};
t.start();
t.interrupt();
System.out.println("interrupt status after interrupt:" + t.isInterrupted());
flag = true;
}
t线程不会休眠10s
并且输出:interrupt status after interrupt:true
interrupt status in catch:false
结合2),可以得出结论:只要线程的isInterrupted()返回true,Thread.sleep()都会抛出异常,并且清除线程的中断状态。
最后还有一个Thread类的静态方法interrupted,调用Thread.interrupted会清除掉当前线程的interrupt status,要注意该方法和isInterrupted的区别
以下是我总结出来的几点,仅供参考,如有错误之处,敬请指出。
1)线程的interrupt state可以通过Thread.currentThread.isInterrupted()来判断这个变量的真假,isInterrupt是一个实例方法,也可以通过线程实例来调用。
There is boolean flag in every thread that indicating the interrupt state,When the interrupt method is called on a thread, the interrupted status of the thread is set.
直译总感觉有点别扭,我还是意译一下吧:如果线程的interrupt方法被调用,那么线程的isInterrupted()返回值会为true,调用前是false;
运行以下代码,可以看到程序的输出会出现这种情况:首先为false,interrupt以后,变为true,但是程序依旧会输出0到9;
private void simpleInterrupt() {
Thread t = new Thread(){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
};
t.start();
System.out.println("before interrupt:" + t.isInterrupted());
t.interrupt();
System.out.println("after interrupt:" + t.isInterrupted());
}
由此可见,interrupt并不像它的中文意思中断一样能中断线程,但是改变了isInterrupted方法的返回值,这个还是可以作为run方法的循环结束的条件,从而中断线程,代码如下:
private void simpleInterruptAffect() {
Thread t = new Thread(){
@Override
public void run() {
for (int i = 0; i < 100 && !isInterrupted(); i++) {
System.out.println(i);
}
}
};
t.start();
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.interrupt();
}
多运行几遍,发现i没到99就结束了。
2)If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
当线程由于sleep或者wait等方法阻塞时,如果调用了interrupt方法,就会抛出一个异常(补充:core java上说是由于系统无法检测处于阻塞状态线程的interrupt state),并且清除掉线程的interrupt status(使得isInterrupted方法返回false),用代码验证一下
private void interruptSleep() {
Thread t1 = new Thread() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("interrupt status in catch:" + isInterrupted());
}
}
};
t1.start();
System.out.println("interrupt status before interrupt:" + t1.isInterrupted());
t1.interrupt();
System.out.println("interrupt status after interrupt:" + t1.isInterrupted());
}
一般会依次输出 interrupt status before interrupt:false
interrupt status after interrupt:true
interrupt status in catch:false
3)If you call the sleep method when the interrupted status is set, it doesn’t sleep. Instead, it
clears the status and throws an InterruptedException.
同样是意译:如果线程睡眠前线程它的isInterrupted返回true,线程就不会睡眠,相反,线程的会清除掉interrupt status并且抛出一个异常。同样用代码验证一下。
volatile boolean flag = false;
private void interruptThenSleep() {
Thread t = new Thread(){
@Override
public void run() {
while(!flag){}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("interrupt status in catch:" + isInterrupted());
}
}
};
t.start();
t.interrupt();
System.out.println("interrupt status after interrupt:" + t.isInterrupted());
flag = true;
}
t线程不会休眠10s
并且输出:interrupt status after interrupt:true
interrupt status in catch:false
结合2),可以得出结论:只要线程的isInterrupted()返回true,Thread.sleep()都会抛出异常,并且清除线程的中断状态。
最后还有一个Thread类的静态方法interrupted,调用Thread.interrupted会清除掉当前线程的interrupt status,要注意该方法和isInterrupted的区别
0 0
- 结合interrupt state来理解interrupt
- interrupt
- interrupt
- interrupt()
- interrupt
- interrupt()
- Interrupt
- Interrupt
- 理解interrupt()方法
- java interrupt理解
- Thread.interrupt()方法理解
- 理解Thread.interrupt()的含义
- interrupt、isinterrupt、interrupted的理解和使用
- java线程经典理解之Interrupt
- 理解java线程的中断(interrupt)
- 【转】理解java线程的中断(interrupt)
- 理解Java的Thread中的Interrupt机制
- 关于interrupt,interrupted和isInterrupted的理解
- windows环境下wampserver的配置教程
- 如何开发一款优秀的APP(侧重实践层面)
- 解决Java项目库文件困扰的两个eclipse插件
- 回溯法之0-1背包问题(C实现)
- LEETCODE-Maximum Depth of Binary Tree
- 结合interrupt state来理解interrupt
- 《剑指offer》——二维数组中的查找
- Mangos源码分析(7):服务器公共组件实现之游戏主循环
- mysqldump详解
- 插入排序
- Android之ListView的优化
- 大学生择业的“忙”与“茫”
- cf # 1 B. Spreadsheets
- Git/.a静态库的介绍:创建和使用