如何正确停止一个线程?

在面试过程中 , 有时面试官会问,“如何正确停止一个线程” 。这个问题的言外之意是,如果你以不正确的方式停止一个线程,可能会导致各种异常问题 , 比如数据不一致 , 比如消息丢失等 。
如果你经常阅读开源软件的源码,就发现,源码中经常会出现close这个变量,比如在Kafka的源码RecordAccumulator类中是这样子的:
private volatile boolean closed;
当主动关闭这个类的时候,我们会看到它会把这个变量设置成true,比如这样子
public void close() {this.closed = true;this.free.close();}
在其他地方,则根据close判断是否要继续 , 比如这样子
synchronized(dq){if(closed)thrownewKafkaException("Producerclosedwhilesendinprogress");RecordAppendResultappendResult=tryAppend(timestamp,key,value,headers,callback,dq,nowMs);if(appendResult!=null)returnappendResult;}
一旦close等于true,所有的方法能很快结束 , 最终该线程也能很快结束并被关闭 。
所以正确关闭线程的方式是使用退出标志,使线程正常退出 , 当然一般情况,你需要等待一会,线程才会关闭,毕竟它还是需要完成那最后的工作的,比如他需要等运行到判定close状态那条语句才行 。
【如何正确停止一个线程?】另外,如果你不使用close,使用中断标志也是可以达到相同目的的 。

相关经验推荐