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修飾。