Java中的InterruptedException是什么?

InterruptedException 是 Java 中的异常类,它主要发生在一个正在等待某个时间或资源的线程被其他线程中断时,用于通知该线程所等待的操作已经无法继续。本文将详细讲解 Java 中的 InterruptedException,包括其用法、常见场景和示例说明。

用法

InterruptedException 继承自 Exception 类,通常与多线程编程相关。当一个线程处于等待状态时,它可以通过调用 Thread 类的 interrupt() 方法对该线程进行中断,从而唤醒该线程并抛出 InterruptedException 异常。

InterruptedException 的使用通常有两种方式,一种是通过 try-catch 语句来捕捉并处理异常,另一种是在方法名中抛出此异常。

以下为一段使用 try-catch 语句来处理 InterruptedException 的示例代码:

Thread thread = new Thread(() -> {
    try {
        Thread.sleep(1000L);
    } catch (InterruptedException e) {
        System.out.println("线程被中断");
    }
});
thread.start();
thread.interrupt();

在这个示例中,新建了一个线程并休眠1秒钟。这时,我们使用 interrupt() 方法中断该线程,这会导致线程被唤醒并抛出 InterruptedException 异常。在 try-catch 语句中,我们让线程打印出"线程被中断",以告知我们该线程已经被中断。

以下为抛出 InterruptedException 异常的示例代码:

public void foo() throws InterruptedException {
    while (true) {
        System.out.println("等待中");
        Thread.sleep(1000L);
    }
}

在这个示例中,我们定义了一个名为 foo() 的方法,并在其中通过 while 循环进行线程等待。由于该操作可能被中断,我们在方法名中声明了 InterruptedException 异常。如果该方法中的等待操作被另一个线程中断,就会抛出这个异常。

常见场景

InterruptedException 通常会在以下场景中使用:

等待超时

在多线程编程中,有时需要等待某个操作完成或某个资源释放,在等待的过程中,可以使用 Thread 类中的 sleep() 方法等待一段时间,或者使用 wait() 方法等待唤醒。但是,如果等待过程超出了一定时间,就需要中断等待或者取消任务。这时就可以使用 interrupt() 方法中断等待或者在方法中抛出 InterruptedException 异常。

中断线程

当线程处于运行状态时,它可能会做一些耗时的操作,如果操作过程中发生了异常或者需要提前结束该操作,就需要中断这个线程。在其他线程中调用该线程的 interrupt() 方法即可中断该线程并抛出 InterruptedException 异常。

示例说明

以下为两个常见示例说明。

等待超时

示例代码如下:

public static void main(String[] args) {
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    Future<String> future = executorService.submit(() -> {
        Thread.sleep(3000L);
        return "Hello, World!";
    });
    try {
        String result = future.get(2L, TimeUnit.SECONDS);
        System.out.println(result);
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    } catch (TimeoutException e) {
        future.cancel(true);
        System.out.println("任务超时");
    }
    executorService.shutdown();
}

在这个示例中,我们使用了 ExecutorService 的 submit() 方法提交一个 Callable 接口的任务,并使用 future.get() 方法获取任务返回的结果。此时,我们设置了等待的超时时间为2秒,如果在等待过程中超过了2秒,就会抛出 TimeoutException 异常。此时,我们调用 future.cancel() 方法取消该任务的执行,并打印出"任务超时"。

中断线程

示例代码如下:

public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println("线程运行中");
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                System.out.println("线程被中断");
            }
        }
    });
    thread.start();
    try {
        Thread.sleep(5000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    thread.interrupt();
}

在这个示例中,我们新建一个线程并在其中设置了一个无限循环,循环内部使用了 sleep() 方法等待1秒钟。该线程会一直运行,直到我们通过 interrupt() 方法中断它。当线程被中断时,我们捕捉到了 InterruptedException 异常,并调用 Thread.currentThread().interrupt() 方法再次中断该线程,以保证线程被完全中断,不会继续运行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的InterruptedException是什么? - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月27日

相关文章

  • spring-boot-maven-plugin引入出现爆红(已解决)

    我来给你详细讲解一下关于”spring-boot-maven-plugin引入出现爆红(已解决)”的攻略。 首先,问题的背景是在使用Maven构建项目的过程中,引入了spring-boot-maven-plugin这个插件,但是在IDEA中却出现了红色波浪线的错误提示,这是为什么呢? 原因是因为IDEA默认只加载了一部分的Maven插件,而spring-bo…

    Java 2023年5月20日
    00
  • Springmvc ViewResolver设计实现过程解析

    SpringMVC ViewResolver设计实现过程解析 什么是ViewResolver? 在SpringMVC中,ViewResolver是一个接口,它将逻辑视图名称解析为实际视图对象。它是将控制器返回的逻辑视图名称映射到实际视图对象的关键组件。ViewResolver的主要作用是将逻辑视图名称解析为实际视图对象,以便将其呈现给用户。 ViewReso…

    Java 2023年5月17日
    00
  • 使用IDEA编写jsp时EL表达式不起作用的问题及解决方法

    使用IDEA编写jsp时EL表达式不起作用,可能是因为IDEA默认的jsp版本过高了,导致EL表达式无法正常解析。本文将分享如何解决此问题。 问题分析 在IDEA中编写jsp时,如果使用${}表达式时没有得到正确的结果,可以检查以下几个方面: 是否引入了正确的JSTL标签库并且使用正确的前缀。 是否在web.xml中配置了正确的JSP版本。 是否需要修改ID…

    Java 2023年6月15日
    00
  • Spring Boot 集成MyBatis 教程详解

    下面是关于Spring Boot集成Mybatis的详细攻略。 1. 概述 Mybatis是一种非常流行的持久化框架,Spring Boot是一个快速搭建开发环境的框架,将二者结合使用能够快速地实现数据持久化操作。下面介绍如何在Spring Boot中进行Mybatis集成。 2. 添加依赖 在项目的pom.xml文件中添加Mybatis的依赖。示例代码如下…

    Java 2023年6月3日
    00
  • 如何通过java获取文件名和扩展名

    获取文件名和扩展名是Java中一个常见的操作。下面我来详细讲解Java中如何获取一个文件的文件名和扩展名。 获取文件名 Java中可以使用File类来表示一个文件。获取一个文件的文件名可以使用File类提供的getName()方法,示例如下: File file = new File("D:/test/hello.txt"); Strin…

    Java 2023年5月20日
    00
  • 启用springboot security后登录web页面需要用户名和密码的解决方法

    下面是启用Spring Boot Security后登录Web页面需要用户名和密码的解决方法的完整攻略,包括以下步骤: 1. 添加Spring Boot Security依赖 在pom.xml文件中添加Spring Boot Security依赖: <dependency> <groupId>org.springframework.b…

    Java 2023年6月3日
    00
  • 东八区springboot如何配置序列化

    下面是详细讲解“东八区SpringBoot如何配置序列化”的攻略。 1、序列化概念简述 Java中的序列化是指将一个Java对象转化为字节流,这样可以将对象存储在磁盘上或通过网络传输。而反序列化则是将字节流转化为对象。 在Spring Boot中,对象的序列化往往用于将对象作为响应返回给客户端或者使用Redis等缓存技术进行存储。 2、Spring Boot…

    Java 2023年5月20日
    00
  • JAVA/JSP学习系列之三(Resin+Apache的安装)

    下面是详细的JAVA/JSP学习系列之三(Resin+Apache的安装)攻略,包含了安装过程和示例代码。 Resin+Apache的安装 安装Resin 下载Resin压缩文件,可以在官网https://resin.caucho.com/下载,也可以在镜像网站上下载。 解压文件,将解压后的文件夹移动到/usr/local目录下。 tar -zxvf res…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部