调用Thread对象的stop方法可以强制终止线程,但这种方法只是简单粗暴地终止线程,线程可能存在未做完的工作和未释放的资源,是一种不安全的方法,所以已经被弃用。正确的终止线程的方法是设置flag标志,在run方法中用while循环不断检查flag,而在需要终止线程的地方修改flag,这样就能让线程在本次while循环中完成任务,在下一次while循环判断时被终止,这种方法是安全的。
但要注意,线程被阻塞时无法检查flag标志,这个时候如果我们想让线程终止,靠修改flag标志就无法实现了。所以引入了interrupt机制,默认情况下线程中断状态为false,我们想让线程终止时,就调用interrupt方法,让线程的中断状态被置为true。此时如果线程没有被阻塞,是正常运行状态,则没有任何影响,我们可以在安全的位置调用isInterrupted函数,相当于检测flag标志,然后跳出循环,结束线程;如果此时线程处于阻塞状态,则会抛出一个InterruptedException异常,并重置中断状态为false,我们可以在catch语句中结束线程。
注意isInterrupted方法和静态方法interrupted的区别,虽然两者都用来检测线程的中断状态,但后者有副作用,会导致线程的中断状态被重置为false,而前者不会改变线程的中断状态。