技术文章 > java >  java基础 > 正文

java中断机制解决办法

小妮浅浅

在进行java运行操作时,如果遇到阻碍整个程序就会停下来。阻碍运行的原因很多,可能计时器,I/O 完成,线程的动作。下面我们先从java中断的原理进行分析,然后进行一些中断的操作,最后就报错问题找到一些处理的办法。

1.java中断机制原理

java线程中断的实现是基于一个称为中断状态的内部标志位来实现的,其中断的含义更像是建议,一个线程如何响应另一个线程的中断完全取决于程序员: 继续向上抛出、封装后抛出、中断状态复原、忽略等。java库中的许多抛出 InterruptedException 的方法(例如 sleep)都被设计为取消当前操作并在接收到中断时立即返回。

InterruptException异常就像是一个声明,声明抛出该异常的方法都可被中断,比如wait、sleep、join。异常都是由可中断方法自己抛出来的,并不是直接由interrupt()方法直接引起的。一般来说,任何通过抛出一个 InterruptedException 来退出的方法都应该清除中断状态。

2.java中断api

interrupt()方法本质上就是通过调用java.lang.Thread#interrupt0设置中断flag为true,如下代码演示了该方法的使用: 另启一个线程中断了当前线程。

@Test
public void interruptSt() {
    Thread mainThread = Thread.currentThread();
    new Thread(/*将当前线程中断*/mainThread::interrupt).start();
    try {
        //public static native void sleep(long millis) throws InterruptedException;
        Thread.sleep(1_000);
    } catch (InterruptedException e) {
        System.out.println("main 线程被中断了");
    }
    /*
     *  输出: main 线程被中断了
     */
}
interrupted()和isInterrupted()

在说这两个方法之前先说下private native boolean isInterrupted(boolean ClearInterrupted)这个方法,interrupted()和isInterrupted()方法本质上都是调用该方法。

public boolean isInterrupted() {
    // 设置this线程的中断flag,不会重置中断flag为true
    return isInterrupted(false);
}
public /*静态方法*/static boolean interrupted() {
    // 设置当前线程的中断flag,重置中断flag为true
    return currentThread().isInterrupted(true);
}

使用示例

@Test
public void test_Flag() {
    Thread currentThread = Thread.currentThread();
    currentThread.interrupt();
    System.out.println("当前线程状态 =" + currentThread.isInterrupted());
    System.out.println("当前线程状态 =" + Thread.interrupted());
    System.out.println("当前线程状态 =" + Thread.interrupted());
    /*  输出
        当前线程状态 =true
        当前线程状态 =true
        当前线程状态 =false*/
}

3.响应中断

调用一个可中断的阻塞方法时需要处理受检异常InterruptException,一般来说最容易的方式就是继续抛出InterruptException ,让调用方决定对中断事件作出什么应对。但是对于一些不能在方法头直接添加异常声明的,可以catch出后再进行一些操作,例如使用Runnable时

一般来说当catch到中断时,应该对中断状态进行还原: 调用Thread.currentThread().interrupt();,除非明确自己的操作不会丢失线程中断的证据,从而剥夺了上层栈的代码处理中断的机会。

以上就是java中断机制解决办法,当大家遇到此类情况时,可以尝试使用这种办法进行解决。本文来源于网络,如有雷同联系作者修改。

免费视频教程
本文原创发布python学习网,转载请注明出处,感谢您的尊重!
相关文章
 java IO流有几种
 IO字节流在java中的使用
 java IO字符流的用法
 java字符流和字节流替换方法
 java中File类的使用
 java IO流效率对比
 IO流在java中的实例操作
 java IO流序列化的概念
 IO流反序列化在java中的实现
 IO流序列化在java中的作用及不足
相关视频章节
 网络爬虫
 云端部署Web应用程序视频
 Web应用框架Flask和文件模板
 Web应用程序开发概述
 继承和多态
推荐视频
视频教程分类