天天看點

Java停止線程的幾種方法

1. interruput()

this.interrupted():測試目前線程是否中斷
測試目前線程是否已經中斷,但會清除目前線程的中斷狀态,第二次調用會傳回false.
--------------------------------------------
this.isInterruputed():測試線程是否中斷
測試目前線程是否已經是中斷狀态,但不清除狀态标志。
           

此方法并不會真正終止線程的執行,僅僅給jvm一個中斷标記,具體什麼時候中斷,取決于jvm。

2. 異常法停止線程(推薦使用)

3 sleep()與interrupt()方法一起使用

會報java.lang.InterruptedException()異常
           

4. stop()

暴力法終止線程,已廢棄。

1.不推薦使用
2.會對鎖對象“解鎖”,導緻資料不安全的同步問題
3.會産生java.lang.ThreadDeath()異常
           

5. return 方法

不建議使用,代碼中出現多個return;造成污染

6. 暫停線程方法

suspend():無法控制線程内部代碼持有的鎖的釋放
resume():
           

缺點1:如果使用不當,極易造成公共的同步對象的獨占,使得其他線程無法通路公共同步對象。

2.因為線程的暫停而導緻資料不同步的情況。

7. yield

放棄目前的CPU資源,将它讓給其他的任務去占用CPU執行權。但放棄的時間不确定,有時候剛剛放棄,馬上又獲得CPU時間權。

8.使用volatile開關控制

由于線程interrupt辨別很有可能被擦除,或者邏輯單元不會調用任何可中斷方法,是以使用volatile修飾的開關flag關閉線程也是一種常用的做法。

public class Test {
	static class MyTask extends Thread{
		private volatile boolean closed = false;
		public void run() {
			System.out.println("I will start work");
			while(!closed&&!isInterrupted()) {
				
			}
			System.out.println("end work");
		}
		public void close() {
			this.closed = true;
			this.interrupt();
		}
	}
 public static void main(String[] args) throws InterruptedException {
	MyTask t = new MyTask();
	t.start();
	TimeUnit.MINUTES.sleep(1);
	System.out.println("System will be shutdown");
	t.close();
 	}
}
運作結果:
I will start work
System will be shutdown
end work
           

上面的結果是定義了一個開關變量closed,并且是使用volatile修飾。