線程該如何終止
關(guān)于線程的終止,自然結(jié)束才是好

也許你會(huì)想使用thread.stop(),這個(gè)是直接強(qiáng)行終止線程,容易出現(xiàn)尿到一半叫你縮回去的事,自然不行。
為什么不用stop()方法:
一般來(lái)說,當(dāng)一個(gè)線程的方法體執(zhí)行完,這個(gè)方法就會(huì)結(jié)束了。我們一般不直接使用stop方法來(lái)終止線程,這可能會(huì)導(dǎo)致業(yè)務(wù)邏輯不完整或者破壞原子性的操作,一段代碼可能用來(lái)輸出某些重要的信息,在方法的執(zhí)行中使用stop方法終止線程,會(huì)使得輸出的信息破壞或者不完整;
假如:在原子操作比如重入鎖的使用時(shí),當(dāng)一個(gè)線程對(duì)象多次獲得鎖會(huì)使得計(jì)數(shù)加一,接下來(lái)需要以相同的次數(shù)釋放鎖直到計(jì)數(shù)減到0,別的線程才能獲得鎖資源,這種操作是原子性的,因?yàn)閷?duì)線程來(lái)說,他們拿到鎖和最終釋放鎖時(shí)計(jì)數(shù)都是為0的,因此這是一種原子性操作,假設(shè)在一個(gè)對(duì)象使用鎖的期間,使用stop方法強(qiáng)行終止線程,這會(huì)導(dǎo)致鎖的計(jì)數(shù)不為0,即破壞了原子性操作。綜合來(lái)說,我們?nèi)绻_地終止一個(gè)線程,不應(yīng)該使用stop()這種過時(shí)的方法。

比較常用的是以下兩種方法:
1、使用while循環(huán)輪詢標(biāo)志位,為false則退出循環(huán),結(jié)束方法體,終止線程。
2、使用interrupt()方法在線程阻塞狀態(tài)下結(jié)束線程。?
都是? 通知結(jié)束(根據(jù)狀態(tài)判斷是否進(jìn)入中斷流程,本質(zhì)都一樣)
Thread.currentThread().interrupt();????//?設(shè)置線程中斷狀態(tài),理解發(fā)出一個(gè)中斷信號(hào)
Thread.interrupted();?????// 返回中斷狀態(tài)信息,并將狀態(tài)恢復(fù)默認(rèn)值false
Thread.currentThread().isInterrupted();???? //檢測(cè)此線程是否中斷,返回中斷狀態(tài)信息,但不會(huì)清除中斷狀態(tài)
?

例:
public class MyThread extends Thread {
??? public void run() {
??????? try {
??????????? while (!Thread.currentThread().isInterrupted()) {
??????????????? // 執(zhí)行線程的任務(wù)
??????????????? // 模擬阻塞狀態(tài)
??????????????? Thread.sleep(1000);
??????????? }
??????? } catch (InterruptedException e) {
??????????? // 響應(yīng)中斷請(qǐng)求
??????????? System.out.println("線程被中斷");
??????? }
??? }
??? public static void main(String[] args) {
??????? MyThread thread = new MyThread();
??????? thread.start();
??????? // 等待一段時(shí)間后,調(diào)用 interrupt() 方法來(lái)中斷線程
??????? try {
??????????? Thread.sleep(5000);
????????? ? // 這里改變發(fā)出中斷信號(hào) 改變Thread.currentThread().isInterrupted()的結(jié)果
??????????? thread.interrupt();?
??????? } catch (InterruptedException e) {
??????????? e.printStackTrace();
??????? }
??? }
}