JAVA多线程之中断机制及处理中断的方法

yizhihongxing

JAVA多线程之中断机制及处理中断的方法

在多线程编程中,线程可能会因为各种原因(比如等待不必要的资源、等待IO操作或者Long Running操作)而进入阻塞状态,我们常使用中断机制来解决这种情况。

中断机制

简单来说,中断机制就是用来打断阻塞状态的线程。当一个线程被中断时,它会收到一个 InterruptedException 异常,执行中断处理方法;如果线程不在阻塞状态,调用线程的 interrupt() 方法会将线程的中断标志位置为 true

如何使用中断机制

当我们需要在线程阻塞等待资源的时候,如果稍后可能会有更快捷的途径获取这些资源,那么就可以用Thread.interrupt()方法来中断这个线程,从而避免其一直等待下去。

此外,在 Java 中,还有些阻塞 IO 操作会阻塞线程,比如 InputStream.read() 或者 Socket.accept() 等方法,这些方法都会抛出阻塞异常 InterruptedIOException。这个异常继承了IOException异常,它有一个 bytesTransferred 属性用来指示在中断发生之前已经读取了多少字节。当 bytesTransferred 等于 -1 时,表示操作没有收到任何字节。

例如,下面的代码演示了如何使用 interrupt() 方法来中断线程阻塞:

public class ThreadInterruptDemo extends Thread {

    @Override
    public void run() {
        try {
            System.out.println("线程开始运行...");
            Thread.sleep(10000);
            System.out.println("线程结束运行...");
        } catch (InterruptedException e) {
            System.out.println("线程被中断...");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadInterruptDemo thread = new ThreadInterruptDemo();
        thread.start();
        System.out.println("等待线程运行10秒...");
        Thread.sleep(5000);

        //中断线程
        thread.interrupt();
    }
}

当线程运行到 Thread.sleep(10000); 时,它会阻塞并等待10秒钟,但是在运行到5秒钟时,main() 方法将 thread 线程中断,此时 Thread.sleep(10000); 会抛出 InterruptedException 异常,然后线程执行 catch 语句块并结束运行。

如何处理中断

下面是一个使用 Callable 实现的例子,其中包含了一些线程可以响应中断的处理:

public class CallableInterruptDemo {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        Callable<Integer> task = () -> {
            int result = 0;
            for (int i = 0; i < 10_000_000; i++) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("任务被中断,直接退出!");
                    return 0;
                }
                result += i;
            }
            return result;
        };

        Future<Integer> future = executorService.submit(task);

        try {
            System.out.println("任务结果:" + future.get(1, TimeUnit.SECONDS));
        } catch (TimeoutException e) {
            System.out.println("任务超时...");
        } finally {
            future.cancel(true);
        }

        executorService.shutdown();
    }
}

对于能够响应中断的线程,在处理逻辑中,应该经常检查当前线程的中断标记 Thread.interrupted() 或者 Thread.isInterrupted(),以便及时退出线程并释放资源,从而保证线程的性能和健壮性。

总之,Java 中的中断机制在一些特定场景下是非常有用的,尤其是在处理 IO 或者其他等待资源的情况下。但需要记住的是,中断机制只是一种线程协作机制,它涉及到线程之间的承诺和信任,应该根据具体情况谨慎使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA多线程之中断机制及处理中断的方法 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • java读取resources文件详解及实现代码

    下面是关于“java读取resources文件详解及实现代码”的完整攻略。 什么是resources文件 Resources文件是指在Java应用程序中使用的资源文件,例如文本文件,配置文件,图片和音频文件等。这些资源文件都会被打包成jar包或者war包中,作为整个应用的一部分。 Java中读取resources文件的方法 在Java中,如果想要读取reso…

    Java 2023年5月20日
    00
  • 每日几道java新手入门面试题,通往自由的道路

    完整攻略 理解面试题的重要性 在准备面试题之前,你需要理解面试题的重要性。它不仅可以帮助你提高自己的知识水平,还可以更好地准备面试,提高面试的通过率。同时,每道面试题都可以涉及到各种Java基础知识点的理解和运用,对于初学者而言这是非常有帮助的。 搜索并选择题目 在过去的每日几道Java新手入门面试题中,你需要选择那些与你的Java基础知识匹配的面试题,因为…

    Java 2023年5月19日
    00
  • Java编程实现调用com操作Word方法实例代码

    下面是Java编程实现调用com操作Word方法的完整攻略和示例说明: 调用com操作Word方法的完整攻略 第一步:添加Word对象库 在Java项目中调用Word COM对象之前,首先需要添加Word对象库。在Eclipse中可以通过以下步骤添加: 打开Java项目,右键单击项目名称,选择“Properties”; 在“Java Build Path”中…

    Java 2023年5月23日
    00
  • java实现简单计算器

    Java实现简单计算器攻略 本攻略将介绍如何使用Java语言实现一个简单的计算器,包括用户输入、计算逻辑和结果输出等步骤。 步骤一:获取用户输入 为了实现计算器,我们首先需要从用户处获取输入,包括两个数值和一个操作符。可以通过Scanner类从控制台获取输入,具体实现代码如下: import java.util.Scanner; public class C…

    Java 2023年5月18日
    00
  • 纯JSP+DWR实现三级联动下拉选择菜单实现技巧

    纯JSP+DWR实现三级联动下拉选择菜单,可以参考以下步骤: 首先创建一个JSP页面,其中需要引入DWR JavaScript库和JQuery,这里以使用CDN资源为例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit…

    Java 2023年6月15日
    00
  • Java字符编码解码的实现详解

    Java字符编码解码的实现详解 在Java编程中,字符编码解码是非常重要的一环。本文将详细介绍Java字符编码解码的过程以及常见的实现方式。 字符编码和解码的基本概念 字符编码:将一个字符转化为二进制数据的过程。 字符解码:将二进制数据转化为字符的过程。 在Java中,字符编码和解码都是通过Java标准库中的charset类来实现的。 Java字符编码和解码…

    Java 2023年5月19日
    00
  • 子线程任务发生异常时主线程事务回滚示例过程

    子线程任务发生异常时主线程事务回滚是一种常见的处理机制,下面我将为您提供一个完整的攻略来解释相关的过程。 首先,我们需要了解一些基本的知识点: 什么是子线程子线程就是在主线程之外启动的线程。子线程可以并行执行,无需等待主线程完成。 什么是主线程主线程是程序的入口,它负责启动并控制整个程序的执行流程。所有的子线程都是由主线程创建的。 什么是事务事务是一组相关的…

    Java 2023年5月26日
    00
  • HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable底层原理以及常见面试题 1. HashMap和HashTable的区别 HashMap和HashTable都是Java中的重要容器类,它们的目的是为了存放和访问键值对。虽然它们的功能是相似的,但是它们在底层的实现和使用上有很大的不同。 1.1 HashMap HashMap的底层是基于哈希表实现的,其键值对存储在Entry数…

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