interrupted()和isInterrupted()详述

简介: interrupted()和isInterrupted()详述

前言

当提及如何终止一个线程时,部分读者通常立马想到的方法肯定是stop(),但是stop()方法并不被推荐使用(很多规范中是禁止使用的),其原因是强制终止一个线程,会导致程序不正常的结束,会出现资源未正确释放、程序结果不正确等等问题。而是否终止一个线程应该把这个控制权转交给当前被终止的线程本身,此时采用的办法就是** **interrupt()方法来终止,该方法相当于修改一个共享变量的值,当运行中的线程判断当前值为false则继续运行,如果有地方调用当前thread的interrupt()方法,那么这个值将变为true,此时当前线程可以根据这个值的修改来正确的终止线程的运行。


API

在java.lang.Thread中主要提供了如下与线程中断相关的方法,其具体方法名与主要作用如下表所示。

image.pngimage.pnginterrupted()和isInterrupted()区别

看了上述API讲述和Thread中的源码,已经清楚interrupted()和isInterrupted()的主要区别了


interrupted()为静态方法,isInterrupted()为普通方法

interrupted() 返回中断标志且清除(恢复)中断标志,isInterrupted()仅返回中断标志

使用方法


我们先验证中断异常响应,通过如下两种方法的使用示例来介绍,注意Runner中的run方法的部分区别


方法一

image.pngimage.png方法二

package com.liziba.p7;
import java.util.concurrent.TimeUnit;
/**
 * <p>
 *
 * </p>
 *
 * @Author: Liziba
 * @Date: 2021/6/24 21:18
 */
public class ThreadInterruptedDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runner(), "Thread-01");
        t1.start();
        // 主线程睡眠2秒,保证t1的充分执行
        TimeUnit.SECONDS.sleep(1);
        // 发起中断
        t1.interrupt();
    }
    static class Runner implements Runnable {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println(Thread.currentThread().getName() + " is running .");
                try {
                    // 睡眠2秒,保证主线程发起的中断能被捕获
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    // 不对中断做任何处理,try住异常,打印
                    e.printStackTrace();
                }
            }
        }
    }
}

image.png接下来我们来验证interrupted()对于中断的标志的清除

package com.liziba.p7;
import java.util.concurrent.TimeUnit;
/**
 * <p>
 *    isInterrupted()
 * </p>
 *
 * @Author: Liziba
 * @Date: 2021/6/24 21:20
 */
public class ThreadInterruptDemo2 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Runner(), "Thread-1");
        thread.start();
        TimeUnit.SECONDS.sleep(2);
        thread.interrupt();
    }
    static class Runner implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() +" interrupted flag is " + Thread.currentThread().isInterrupted());
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    System.out.println(Thread.currentThread().getName() + " is running .");
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    // 响应中断,抛出异常后中断位置会被复位,自己中断自己
                    Thread.currentThread().interrupt();
                    // 这里调用isInterrupted()获取当前的中断标志
                    System.out.println(Thread.currentThread().getName()
                            +" interrupted flag is " + Thread.currentThread().isInterrupted());
                }
            }
        }
    }
}

image.png将上述catch中的Thread.currentThread().isInterrupted()修改为Thread.interrupted()再次运行

package com.liziba.p7;
import java.util.concurrent.TimeUnit;
/**
 * <p>
 *
 * </p>
 *
 * @Author: Liziba
 * @Date: 2021/6/24 21:23
 */
public class ThreadInterruptDemo2 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Runner(), "Thread-1");
        thread.start();
        TimeUnit.SECONDS.sleep(2);
        thread.interrupt();
    }
    // 区别在catch中
    static class Runner implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() +" interrupted flag is " + Thread.currentThread().isInterrupted());
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    System.out.println(Thread.currentThread().getName() + " is running .");
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    // 响应中断,抛出异常后中断位置会被复位,自己中断自己
                    Thread.currentThread().interrupt();
                    // 注意区别在这里
                    System.out.println(Thread.currentThread().getName()
                            +" interrupted flag is " + Thread.interrupted());
                }
            }
        }
    }
}

image.pngimage.png

目录
相关文章
|
存储 Prometheus 监控
高可用Prometheus集群
高可用Prometheus集群
1614 0
|
消息中间件 存储 Java
吃透 RocketMQ 消息中间件,看这篇就够了!
本文详细介绍 RocketMQ 的五大要点、核心特性及应用场景,涵盖高并发业务场景下的消息中间件关键知识点。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
吃透 RocketMQ 消息中间件,看这篇就够了!
|
SQL 消息中间件 分布式计算
大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现
大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现
340 0
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:跨平台模型移植与部署
【7月更文挑战第10天】 使用Python实现深度学习模型:跨平台模型移植与部署
870 1
|
安全 Java Spring
Spring Boot 关闭 Actuator ,满足安全工具扫描
Spring Boot 关闭 Actuator ,满足安全工具扫描
2009 0
|
监控 Java 测试技术
持续集成与持续部署:原理、实践与代码示例
持续集成与持续部署:原理、实践与代码示例
318 3
|
Java 数据库连接 数据安全/隐私保护
springboot @Retention(RetentionPolicy.RUNTIME)的概念与使用
【4月更文挑战第25天】在 Java 注解中,@Retention 注解指定了注解的保留策略,即这个注解在什么阶段还有效。RetentionPolicy.RUNTIME 是这三种策略之一,表示注解不仅被保存到类文件中,还在运行时通过反射可见,这是其它两种策略(SOURCE 和 CLASS)所不具备的
1540 1
|
消息中间件 关系型数据库 MySQL
[flink 实时流基础] 输出算子(Sink)
[flink 实时流基础] 输出算子(Sink)
834 1
PreparedStatement 防止 SQL 注入原理
PreparedStatement 对象可以防止 SQL 注入,而 Statement 对象不能防止 SQL 注入,接下来使用一个案例剖析原理。
PreparedStatement 防止 SQL 注入原理
|
运维 数据可视化 中间件
一文搞懂SaaS、PaaS、IaaS的概念和异同
一文搞懂SaaS、PaaS、IaaS的概念和异同
65967 6
一文搞懂SaaS、PaaS、IaaS的概念和异同

热门文章

最新文章