[ISSUE #4095] Code Optimization and Interrupeted Exception handling.

issue介绍

tag: first good issue

地址:github.com/apache/even...

Code Optimization and Interrupeted Exception handling in EtcdCustomService.class

对EtcdCustomService类的变量以及InterrupetedException处理的优化

知识点

Interrupeted Exception

大家先看下面这段代码:

1.创建一个Runnable类

Java 复制代码
public class InterruptedRunnable implements Runnable {
    @Override
    public void run() {
        Thread currentThread = Thread.currentThread();
        while(true){
            if(currentThread.isInterrupted()){
                break;
            }

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

2.运行的时候对它进行中断

Java 复制代码
public class Main {

    public static void main(String[] args) {
        InterruptedRunnable interruptedRunnable = new InterruptedRunnable();
        Thread interruptedThread = new Thread(interruptedRunnable);
        interruptedThread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        interruptedThread.interrupt();
    }

}

可以观察到两点:

1.Interrupted Exception

2.线程当前还在运行

上述代码明明调用了线程的interrupt()方法来中断线程,但是却并没有起到啥作用。原因是线程的run()方法在执行的时候,大部分时间都是阻塞在sleep(100)上,当其他线程通过调用执行线程的interrupt()方法来中断执行线程时,大概率的会触发InterruptedException异常。

如何正确处理Interrupeted Exception

在触发InterruptedException异常的同时,JVM会同时把线程的中断标志位清除,所以,这个时候在run()方法中判断的currentThread.isInterrupted()会返回false,也就不会退出当前while循环了。

处理InterruptedException异常时要小心,如果在调用执行线程的interrupt()方法中断执行线程时,抛出了InterruptedException异常,则在触发InterruptedException异常的同时,JVM会同时把执行线程的中断标志位清除,此时调用执行线程的isInterrupted()方法时,会返回false。此时,正确的处理方式是在执行线程的run()方法中捕获到InterruptedException异常,并重新设置中断标志位(也就是在捕获InterruptedException异常的catch代码块中,重新调用当前线程的interrupt()方法)。 我们在类的catch中进行一个中断标志位的设置

Java 复制代码
try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    e.printStackTrace();
    currentThread.interrupt();
}

主线程就会运行结束:

pr过程中注意的事项

  1. fork到自己的仓库然后创建对应的分支解决问题 比如git checkout -b fix_patch_4508
  2. checkstyle一定要配置好,不然ci必报错(一个小空格都会报错),ci会检查你commit的文件
  3. 提PR的时候注意格式(标题、正文带解决的issue (Fixs #xxx))

参考对应的官方文档: eventmesh.apache.org/zh/communit...

------------开源小白 希望不断积累

相关推荐
IT_陈寒1 小时前
SpringBoot实战:5个让你的API性能翻倍的隐藏技巧
前端·人工智能·后端
梦想很大很大1 小时前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go
唐叔在学习2 小时前
就算没有服务器,我照样能够同步数据
后端·python·程序员
用户68545375977693 小时前
同步成本换并行度:多线程、协程、分片、MapReduce 怎么选才不踩坑
后端
javaTodo3 小时前
Claude Code 记忆机制详解:从 CLAUDE.md 到 Auto Memory,六层体系全拆解
后端
南果梨3 小时前
OpenClaw 完整教程!从安装到使用(官方脚本版)
前端·git·开源
LSTM973 小时前
使用 C# 和 Spire.PDF 从 HTML 模板生成 PDF 的实用指南
后端
JaguarJack3 小时前
为什么 PHP 闭包要加 static?
后端·php·服务端
BingoGo3 小时前
为什么 PHP 闭包要加 static?
后端
是糖糖啊4 小时前
OpenClaw 从零到一实战指南(飞书接入)
前端·人工智能·后端