1. 程式人生 > >多執行緒學習(四):停止執行緒

多執行緒學習(四):停止執行緒

停止執行緒

停止一個執行緒可以使用Thread.stop()方法,但最好不用它,因為這個方法是不安全的,而且已被棄用。
大多數停止一個執行緒的操作使用Thread.interrupt()方法,但是這個方法不會終止一個正在執行的執行緒,還需要加入一個判斷才可以完成執行緒的停止。
Java中有3中停止執行緒的方法
1:使用退出標誌,使執行緒正常退出,也就是當run方法完成後執行緒終止。
2:使用stop方法強行終止執行緒,但是不推薦,因為已經作廢,使用會產生不可預料的結果。
3:使用interrupt方法中斷執行緒。

interrupt()

interrupt()方法只是在當前執行緒中打了一個停止的標記,並不是真的停止執行緒。
在這裡插入圖片描述

判斷執行緒是否是停止狀態

  1. this.interrupted(); 測試當前執行緒是否已經中斷,當前執行緒是指執行this.interrupted()方法的執行緒。
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
  2. this.isInterrupted(); 測試執行緒是否已經中斷
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    總結:
    this.interrupted():是一個static方法,測試當前執行緒是否已經是中斷狀態,執行後會將狀態標誌清除為false。
    this.isInterrupted():不是static方法,測試執行緒Thread物件是否已經是中斷狀態,但不清除狀態標誌。

通過異常法停止執行緒

public class MyThread extends Thread{
	@Override
	public void run() {
		for(int i=0;i<500000;i++){
			if(this.interrupted()){
				System.out.println("已經是停止狀態了!我要退出了!");
				break;
			}
			System.out.println("i="+(i+1));
		}
		System.out.println("執行這句話,說明執行緒並未停止!");
	}
	public static void main(String[] args) {
		MyThread thread=new MyThread();
		try {
			thread.start();
			thread.sleep(2000);
			thread.interrupt();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("執行結束!");
	}
}

在這裡插入圖片描述
上述例子說明:執行緒接受到interrupt()後,for迴圈執行結束後,執行緒會繼續執行。
在這裡插入圖片描述
在這裡插入圖片描述

小結:丟擲異常之後,後面的程式肯定不會再執行了,子執行緒catch後面都沒程式碼了,還不結束等個鬼啊,這個方法結束子執行緒不太高大上,土辦法!!!