线程该如何终止
关于线程的终止,自然结束才是好

也许你会想使用thread.stop(),这个是直接强行终止线程,容易出现尿到一半叫你缩回去的事,自然不行。
为什么不用stop()方法:
一般来说,当一个线程的方法体执行完,这个方法就会结束了。我们一般不直接使用stop方法来终止线程,这可能会导致业务逻辑不完整或者破坏原子性的操作,一段代码可能用来输出某些重要的信息,在方法的执行中使用stop方法终止线程,会使得输出的信息破坏或者不完整;
假如:在原子操作比如重入锁的使用时,当一个线程对象多次获得锁会使得计数加一,接下来需要以相同的次数释放锁直到计数减到0,别的线程才能获得锁资源,这种操作是原子性的,因为对线程来说,他们拿到锁和最终释放锁时计数都是为0的,因此这是一种原子性操作,假设在一个对象使用锁的期间,使用stop方法强行终止线程,这会导致锁的计数不为0,即破坏了原子性操作。综合来说,我们如果要正确地终止一个线程,不应该使用stop()这种过时的方法。

比较常用的是以下两种方法:
1、使用while循环轮询标志位,为false则退出循环,结束方法体,终止线程。
2、使用interrupt()方法在线程阻塞状态下结束线程。
都是 通知结束(根据状态判断是否进入中断流程,本质都一样)
Thread.currentThread().interrupt(); // 设置线程中断状态,理解发出一个中断信号
Thread.interrupted(); // 返回中断状态信息,并将状态恢复默认值false
Thread.currentThread().isInterrupted(); //检测此线程是否中断,返回中断状态信息,但不会清除中断状态

例:
public class MyThread extends Thread {
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
// 执行线程的任务
// 模拟阻塞状态
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// 响应中断请求
System.out.println("线程被中断");
}
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
// 等待一段时间后,调用 interrupt() 方法来中断线程
try {
Thread.sleep(5000);
// 这里改变发出中断信号 改变Thread.currentThread().isInterrupted()的结果
thread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}