优雅关闭线程实践

前言

在多线程编程中会需要动态创建线程来执行任务,在完成后释放该线程,使用Excuotrs创建的线程,提供了shutDown方法进行线程的关闭,但使用原生的Thread和Runable创建的线程池,其stop、destory方法都已经被标为Deprecate,那究竟该如何关闭线程?

实现逻辑

1、如果线程能正常执行完,执行结束后线程自动关闭,无须特别处理

2、否则需要使用一个标记如下running来控制并跳出线程循环执行体,完成线程的自动关闭

3、如果线程循环执行体存储阻塞,则在设置running变量,还需要通过interrupt中断阻塞,使其能够跳出线程循环执行体,完成线程的自动关闭。

下面是供参考的代码逻辑:

public class BgpLsLinkMsgHandlerThread extends Thread { private volatile boolean running = true; @Override public void run() { while (running) { try { BgplsMsg message = queue.take(); bgpLsMsgHandler.handle(message); } catch (Exception e) { logger.error(“BgpLsLinkMsgHandlerThread handler exception.”, e); } } } public void handleMessage(BgplsMsg message) { try { queue.put(message); } catch (InterruptedException e) { logger.error(this, e); } } public int queueSize() { return queue.size(); } /** * 优雅终止线程 */ public synchronized void termination() { this.running = false; this.interrupt(); }}

方法termination在修改标记变量running后,调用了中断函数interrupt,避免程序阻塞导致实际上并未关闭线程。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
上一篇 2022年6月15日 06:21
下一篇 2022年6月15日 06:21

相关推荐

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息