前言
在多线程编程中会需要动态创建线程来执行任务,在完成后释放该线程,使用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,避免程序阻塞导致实际上并未关闭线程。