issue介绍

tag: first good issue

地址:github.com/apache/even…

Code Optimization and Interrupeted Exception handling in EtcdCustomService.class

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

知识点

Interrupeted Exception

大家先看下面这段代码:

1.创立一个Runnable类

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.运转的时分对它进行中止

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中进行一个中止标志位的设置

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

主线程就会运转结束:

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

pr过程中留意的事项

  1. fork到自己的库房然后创立对应的分支解决问题 比方git checkout -b fix_patch_4508
  2. checkstyle一定要装备好,否则ci必报错(一个小空格都会报错),ci会检查你commit的文件
  3. 提PR的时分留意格局(标题、正文带解决的issue (Fixs #xxx))

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

————开源小白 期望不断堆集