interruput方法

目录

interruput方法

interruput的调用者

interruput为线程的实例方法

由线程对象调用

线程不同状态时interrupt

WAIT/TIMEDWAIT状态

即此线程调用了sleep或wait方法后的状态

  1. 结束其等待状态

  2. 被打断的线程抛出interruptedException
    同时释放持有的锁

  3. 被打断的线程结束(转入terminited状态)

RUNNING/RUNNABLE状态

此线程的中断标志位被设置为true

此线程需要使用isInterruputed方法主动进行中断检测
并进行响应

BLOCKED状态

此线程不能做出任何响应

可以在恢复执行后进行检测

Interruput相关的方法

public boolean isInterrupted()

测试此线程是否已中断。线程的中断状态不受此方法的影响。
由于线程在中断时不活动而被忽略的线程中断将通过此方法返回false反映出来。
(此检测中断的方法不重置中断标志位)
(此检测中断的方法由线程实例调用 返回的为此线程实例的中断状态)

public static boolean interrupted()

测试当前线程是否已中断。线程的中断状态通过此方法清除。换句话说,如果要连续两次调用此方法,则第二次调用将返回false (除非当前线程再次中断,在第一次调用清除了其中断状态之后并且在第二次调用检查之前)。
由于线程在中断时不活动而被忽略的线程中断将通过此方法返回false反映出来。
(此检测方法重置中断标志位)
(静态方法 返回的是执行此语句的线程的中断标志位)

public void interrupt()

中断此线程。
除非当前线程正在中断自身 (这始终是允许的),否则将调用此线程的checkAccess方法,这可能会导致引发SecurityException。
如果此线程在对象类的wait(),wait(long) 或wait(long,int) 方法,或join(),join(long),join(long,int),sleep(long) 的调用中被阻止,或者sleep(long,int),这个类的方法,那么它的中断状态将被清除,它将收到一个InterruptedException。
如果此线程在中断通道上的I/O操作中被阻止,则该通道将被关闭,线程的中断状态将被设置,线程将收到一个java.nio.channels.Closeedbyinterruptexception。
如果此线程在java.nio.channels.Selector中被阻止,则线程的中断状态将被设置,并且它将从选择操作中立即返回,可能具有非零值,就像调用选择器的唤醒方法一样。
如果以前的条件都不成立,则将设置该线程的中断状态。
中断一个死亡的线程不会有任何效果。

中断测试

RUNNING状态下的中断测试

public class InterruputTest {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            while(true){
                if(Thread.currentThread().isInterrupted()){//检测中断标志位
                    System.out.println("检测到中断");//如果收到中断请求 输出
                    Thread.interrupted();//清除中断标志位
                }
            }
        });
        t1.start();

        while(true){
            Thread.sleep(1000);//每一秒向t1线程发出一次中断请求
            t1.interrupt();
        }
    }
}

在这里插入图片描述

主线程每秒向t1线程发出一次中断请求

t1循环检测中断 每检测到中断输出一句"检测到中断请求"

并清楚其中断标志位

BLOCKED状态下的中断测试

public class InterruputTest1 {
    static final Object lock = new Object();//锁对象
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }//睡眠 等待主线程拿到锁
            synchronized (lock){//t1线程阻塞 等待主线程释放锁
                System.out.println("t1线程持有锁");
                //主线程结束休眠 退出同步代码块后 t1线程进入同步代码块
                if(Thread.currentThread().isInterrupted())
                    System.out.println("t1线程收到中断请求");//如果正确收到了中断请求 输出
            }
        });
        t1.start();
        synchronized (lock){
            System.out.println("主线程持有锁");
            try {
                Thread.sleep(2000);//睡眠 等待子线程进入阻塞状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t1.interrupt();//打断阻塞状态中的t1线程
            System.out.println("主线程:t1.interrupt()");
            System.out.println("主线程释放锁");
        }
    }
}

在这里插入图片描述

在阻塞期间收到中断请求不会做出反应

但可以在恢复执行后进行主动检测并响应

WAITING/TIMEEDWAITING状态下的中断测试

public class InterruptTest {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            System.out.println("t1线程启动");
            System.out.println("t1线程休眠");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e)/*捕捉InterruptedException*/ {
                System.out.println("t1收到中断请求 抛出异常");
                e.printStackTrace();
            }
        });
        t1.start();
        System.out.println("主线程启动");
        Thread.sleep(500);//等待t1线程进入休眠
        System.out.println("主线程:t1.interrupt()");
        t1.interrupt();
        Thread.sleep(500);//等待t1线程抛出异常
        System.out.println("主线程:检测t1线程当前状态为"+t1.getState());
    }
}

在这里插入图片描述

t1线程在waiting状态收到中断请求 抛出异常后进入TERMINITED状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值