java多线程 interrupt(), interrupted(), isInterrupted()方法区别

interrupt():将调用该方法的线程标记为终止阻塞状态,标记为终止阻塞状态后,如果该方法中遇到wait()、join()、sleep()方法导致线程阻塞,线程阻塞将被终止,并抛出InterruptedException异常,捕获异常后,线程可以继续运行,但如果不捕获异常,线程将无法继续运行。

isInterrupted():判断调用该方法的线程是否被标记成了阻塞状态。

interrupted():Thread类的静态方法,判断当前线程是否被标记成了阻塞状态,该方法在判断完毕后会取消当前线程的终止阻塞标记。

Demo1:

使用interrupt()方法将新开辟线程标记为终止阻塞状态,并使用isInterrupted()方法判断线程的标记状态。

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 1、使用sleep测试interrupt()
                System.out.println("thread线程 开始 执行");
                try {
                    Thread.sleep(2000);
                    System.out.println("当前线程完成了第一次2秒休眠");
                } catch (InterruptedException e) {
                    System.out.println("thread线程 第一次休眠 被终止");
                }
                System.out.println("thread线程 继续 执行");
                try {
                    Thread.sleep(2000);
                    System.out.println("当前线程完成了第二次2秒休眠");
                } catch (InterruptedException e) {
                    System.out.println("thread线程 第二次休眠 被终止");
                }
                System.out.println("thread线程执行完毕");
            }
        });
        thread.start();
        // 判断thread是否被标记为“终止阻塞”状态
        System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
        // 将thread线程标记为“终止阻塞”状态,标记之后如果线程中调用wait()、join()、sleep()方法使线程阻塞,则线程阻塞被终止。
        thread.interrupt();
        // 判断thread是否被标记为“终止阻塞”状态
        System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
    }

运行结果:

thread线程是否被标记‘终止阻塞’?:false
thread线程 开始 执行
thread线程是否被标记‘终止阻塞’?:true
thread线程 第一次休眠 被终止
thread线程 继续 执行
当前线程完成了第二次2秒休眠
thread线程执行完毕

 可以看到:interrupt()将线程标记为终止阻塞状态后,线程中的sleep()被终止,线程继续执行,而第二次sleep()没有被终止,如果希望第二次sleep()也被终止的话,需要再次调用interrupt()方法。

Demo2:

使用interrupt()方法将新开辟线程标记为终止阻塞状态,并使用isInterrupted()方法判断线程的标记状态。

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 2、使用while循环测试interrupt()
                System.out.println("thread线程 开始 执行");
                while (true) {
                    for (int i = 0; i < 2100000000; i++) {
                        if (i == 0) {
                            System.out.println("thread线程正在运行");
                        }
                    }
                }
            }
        });
        thread.start();
        // 判断thread是否被标记为“终止阻塞”状态
        System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
        // 将thread线程标记为“终止阻塞”状态,标记之后如果线程中调用wait()、join()、sleep()方法使线程阻塞,则线程阻塞被终止。
        thread.interrupt();
        // 判断thread是否被标记为“终止阻塞”状态
        System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
        for (int i = 1; i <= 2100000000; i++) {
            if (i == 2100000000) {
                System.out.println("当前线程完成了一次伟大的循环");
            }
        }
        // 判断thread是否被标记为“终止阻塞”状态
        System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
    }

运行结果:

thread线程是否被标记‘终止阻塞’?:false
thread线程 开始 执行
thread线程正在运行
thread线程是否被标记‘终止阻塞’?:true
当前线程完成了一次伟大的循环
thread线程是否被标记‘终止阻塞’?:true
thread线程正在运行
thread线程正在运行

 可以看到:线程被interrupt()方法标记为阻塞状态后,由于线程中没有调用wait()、join()、sleep()方法,线程会继续执行。

Demo3:

使用interrupt()方法将当前线程标记为终止阻塞状态,并使用interrupted()方法判断线程的标记状态。

    public static void main(String[] args) {
        // 判断当前线程是否被标记为“终止阻塞”状态
        System.out.println("当前线程是否被标记‘终止阻塞’?:"+Thread.interrupted());
        // 将当前线程标记为“终止阻塞”状态
        Thread.currentThread().interrupt();
        // 判断当前线程是否被标记为“终止阻塞”状态
        System.out.println("当前线程是否被标记‘终止阻塞’?:"+Thread.interrupted());
        // 判断当前线程是否被标记为“终止阻塞”状态
        System.out.println("当前线程是否被标记‘终止阻塞’?:"+Thread.interrupted());
        try {
            Thread.sleep(2000);
            System.out.println("当前线程完成了2秒休眠");
        } catch (InterruptedException e) {
            System.out.println("当前线程阻塞被终止");
        }
    }

运行结果:

当前线程是否被标记‘终止阻塞’?:false
当前线程是否被标记‘终止阻塞’?:true
当前线程是否被标记‘终止阻塞’?:false
当前线程完成了2秒休眠

可以看到:当前线程被interrupt()方法标记为终止阻塞状态后,Thread.interrupted()判断结果为true,再次调用Thread.interrupted()方法判断结果为false,因为Thread.interrupted()会取消线程的终止阻塞标记,后边的sleep()方法并没有被终止。

Demo4:

使用interrupt()方法将当前线程标记为终止阻塞状态,线程中调用sleep()方法,并捕获异常,查看运行结果。

    public static void main(String[] args) {
        // 将当前线程标记为“终止阻塞”状态
        Thread.currentThread().interrupt();
        try {
            Thread.sleep(2000);
            System.out.println("当前线程完成了2秒休眠");
        } catch (InterruptedException e) {
            System.out.println("当前线程阻塞被终止");
        }
    }

运行结果:

当前线程阻塞被终止

可以看到:当前线程被interrupt()方法标记为终止阻塞状态后,后边的sleep()方法被终止。

Demo5:

使用interrupt()方法将当前线程标记为终止阻塞状态,线程中调用sleep()方法,但不捕获异常,查看运行结果。

    public static void main(String[] args) throws InterruptedException {
        // 将当前线程标记为“终止阻塞”状态
        Thread.currentThread().interrupt();
        Thread.sleep(2000);
        System.out.println("当前线程继续运行");
    }

运行结果:

由于没有捕获异常,线程的sleep()方法被终止后,将抛出InterruptedException,线程不再继续运行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值