关于interrupt方法打断wait和sleep的感悟

1.interrupt方法打断线程之后,该线程并不会停下来,而是继续运行,如果是wait状态和sleep状态则会抛出异常。

2.interrupt方法打断不在wait状态或sleep状态中的线程,该线程的打断标记为true。如果打断wait状态或sleep状态中的线程,该打断标记还是为false。但是可以在catch中利用interrupt进行设置打断标记,此时该线程的打断标记就为true。

3.如果该线程结束,其他线程获取该线程的打断标记则为false。

注意:这里获取打断标记都是用的isInterrupted方法,因为interrupted方法为将打断标记重置为false。

附录:

/**
 * 打断wait和sleep之后,处理异常之后,只有该线程能够获得true的打断标记
 * 如果该线程结束,主线程只能获得false的标记
 */
public class Test06 {
    public static void main(String[] args) throws InterruptedException {
        Object o = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (o) {
                try {
                    o.wait();
                } catch (InterruptedException e) {
                    System.out.println(Thread.currentThread().isInterrupted());
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                    System.out.println(Thread.currentThread().isInterrupted());
                    System.out.println(Thread.currentThread().isInterrupted());
                }
            }
            while (true) {

            }

//            try {
//                Thread.sleep(2000);
//            } catch (InterruptedException e) {
//                System.out.println(Thread.currentThread().isInterrupted());
//                Thread.currentThread().interrupt();
//                e.printStackTrace();
//                System.out.println(Thread.currentThread().isInterrupted() + "====t1");
//            }
        }, "t1");
        t1.start();

        Thread.sleep(100);
        t1.interrupt();
        Thread.sleep(100);
        System.out.println(t1.isInterrupted() + "=====main");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值