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日

相关文章

  • springMVC几种页面跳转方式小结

    SpringMVC几种页面跳转方式小结 在SpringMVC中,有多种方式可以实现页面跳转。本文将介绍其中的几种方式,并提供示例说明。 方式一:使用redirect 使用redirect可以实现页面的重定向。在控制器方法中,我们可以使用”redirect:”前缀来指定重定向的URL。下面是一个示例的控制器方法: @GetMapping("/redi…

    Java 2023年5月17日
    00
  • SpringBoot应用快速部署到K8S的详细教程

    将Spring Boot应用快速部署到Kubernetes(K8S)是一项非常有用的技能,可以帮助开发人员更快地将应用程序部署到生产环境中。以下是Spring Boot应用快速部署到K8S的详细攻略: 1. 准备工作 在开始之前,需要完成以下准备工作: 安装Docker和Kubernetes 创建一个Docker镜像仓库 创建一个Kubernetes集群 2…

    Java 2023年5月14日
    00
  • JavaWeb入门:ServletContext详解和应用

    JavaWeb入门:ServletContext详解和应用 ServletContext是JavaEE中一个非常重要的Web接口,它代表了Servlet容器提供的一个Web应用程序的环境,可以用来从应用程序中获取初始化参数、获取上下文路径、获取资源路径、记录日志信息等。 ServletContext对象 ServletContext对象是由Servlet容器…

    Java 2023年6月15日
    00
  • JS实现的简单拖拽购物车功能示例【附源码下载】

    下面我就简单介绍一下 JS 实现的简单拖拽购物车功能示例的完整攻略。首先,该示例的功能主要就是实现物品拖拽,同时将拖拽到的物品添加到购物车中。 示例说明1:创建HTML页面 首先需要创建一个 HTML 页面,该页面内容如下: <!DOCTYPE html> <html> <head> <meta charset=&q…

    Java 2023年5月26日
    00
  • Java日期与时间类原理解析

    Java日期与时间类原理解析 介绍 Java日期与时间类是Java标准库中的一个重要组成部分,它提供了一系列的类和方法,用于处理日期、时间和时间区域相关的问题。在Java程序开发中,日期和时间是必不可少的数据类型,因此学习Java日期与时间类是非常重要的。 本文将介绍Java日期与时间类的原理和使用,包括常用类:Date、DateFormat、SimpleD…

    Java 2023年5月20日
    00
  • IntelliJ IDEA 2020 安装和常用配置(推荐)

    IntelliJ IDEA 2020 安装和常用配置 安装 IntelliJ IDEA 2020 下载 IntelliJ IDEA 2020 的安装程序,可以到官方网站 https://www.jetbrains.com/idea/ 下载。 安装安装程序,一路默认即可,安装完成后启动软件。 常用配置 1. 设置编码格式 在项目中设置编码格式非常重要,可以避免…

    Java 2023年5月19日
    00
  • SSH框架网上商城项目第8战之查询和删除商品类别功能实现

    SSH框架网上商城项目第8战之查询和删除商品类别功能实现 一、实现查询商品类别功能 在商品类别管理页面上添加查询按钮,点击查询按钮后会向后端发送一个AJAX请求,请求返回后,在页面上展示查询到的商品类别列表。 代码实现步骤如下: 在商品类别管理页面上添加查询按钮 html <button id=”search-btn” class=”btn btn-p…

    Java 2023年6月15日
    00
  • 基于SpringBoot开机启动与@Order注解

    基于Spring Boot开机启动与@Order注解 在Spring Boot应用程序中,我们可以使用@Order注解来指定Bean的加载顺序。此外,我们还可以使用Spring Boot的开机启动功能,在应用程序启动时自动执行一些任务。本文将介绍如何使用@Order注解和开机启动功能。 @Order注解 @Order注解是Spring框架提供的一个注解,用于…

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