在面试过程中,有时面试官会问,“如何正确停止一个线程”。这个问题的言外之意是,如果你以不正确的方式停止一个线程,可能会导致各种异常问题,比如数据不一致,比如消息丢失等。
如果你经常阅读开源软件的源码,就发现,源码中经常会出现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,使用中断标志也是可以达到相同目的的。