龙空技术网

如何正确停止一个线程?

大雁小鱼611 201

前言:

如今同学们对“java线程的关闭”可能比较关心,我们都需要知道一些“java线程的关闭”的相关内容。那么小编在网络上汇集了一些对于“java线程的关闭””的相关知识,希望咱们能喜欢,姐妹们快快来学习一下吧!

在面试过程中,有时面试官会问,“如何正确停止一个线程”。这个问题的言外之意是,如果你以不正确的方式停止一个线程,可能会导致各种异常问题,比如数据不一致,比如消息丢失等。

如果你经常阅读开源软件的源码,就发现,源码中经常会出现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,使用中断标志也是可以达到相同目的的。

标签: #java线程的关闭