浅谈浅谈Java线程线程Thread之之interrupt中断解析中断解析
主要介绍了Java线程Thread之interrupt中断解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。
一起跟随小编过来看看吧
这一篇我们说说Java线程Thread的interrupt中断机制。
中断线程中断线程
线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待
新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断
(中断标示值是否为true)。它并不像stop方法那样会中断一个正在运行的线程。
判断线程是否被中断判断线程是否被中断
判断某个线程是否已被发送过中断请求,请使用Thread.currentThread().isInterrupted()方法(因为它将线程中断标示位设置为
true后,不会立刻清除中断标示位,即不会将中断标设置为false),而不要使用thread.interrupted()(该方法调用后会将中断
标示位清除,即重新设置为false)方法来判断,下面是线程在循环中时的中断方式:
while(!Thread.currentThread().isInterrupted() && more work to do){
do more work
}
interrupt之中断状态标记之中断状态标记
interrupt中断机制中有如下方法:
1. Thread.interrupt(),设置当前中断标记为true(类似属性的set方法)
2. Thread.isInterrupted(),检测当前的中断标记(类似属性的get方法)
3. Thread.interrupted(),检测当前的中断标记,然后重置中断标记为false(类似属性的get方法+set方法)
因此interrupt中断机制并不是真正的将当前线程中断,而是一个中断标记的变化。我们先用例子来测试一下。
public class InterruptTest {
//这里用来打印消耗的时间
private static long time = 0;
private static void resetTime(){
time = System.currentTimeMillis();
}
private static void printContent(String content){
System.out.println(content + " 时间:" + (System.currentTimeMillis() - time));
}
public static void main(String[] args) {
test1();
}
private static void test1(){
Thread1 thread1 = new Thread1();
thread1.start();
//延时3秒后interrupt中断
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread1.interrupt();
printContent("执行中断");
}
private static class Thread1 extends Thread{
@Override public void run() {
resetTime();
int num = 0;
while (true){
if(isInterrupted()){
printContent("当前线程 isInterrupted");
break;
}
num++;
if(num % 100 == 0){
printContent("num : " + num);
}
}
}
}
评论10