issue介绍
tag: first good issue
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过程中注意的事项
- fork到自己的仓库然后创建对应的分支解决问题 比如
git checkout -b fix_patch_4508
- checkstyle一定要配置好,不然ci必报错(一个小空格都会报错),ci会检查你commit的文件
- 提PR的时候注意格式(标题、正文带解决的issue (Fixs #xxx))
参考对应的官方文档: eventmesh.apache.org/zh/communit...
------------开源小白 希望不断积累