Java如何正確停止執行緒?
阿新 • • 發佈:2019-01-03
在多執行緒開發時,停止執行緒是很重要的一個技術,因此,如何正確停止一個執行緒,對於從事多執行緒開發的人員是很重要且十分必要的。
1. 什麼是停止執行緒?
所謂停止執行緒,就是讓一個正在處理任務的執行緒,停止繼續執行,放棄當前任務的操作。
2. 判斷執行緒是否是停止狀態的方法?
Thread.java類中提供了;兩種方法進行判斷,分別是:interrupted()和isInterrupted()方法。
Interrupted():測試當前執行緒是否已經中斷。執行後具有清除中斷狀態的功能。
isInterrupted():測試執行緒都否已經中斷。沒有清除中斷狀態的功能。
3. Java中如何正確停止執行緒
JDK1.2以前通過使用stop()方法來停止執行緒。但是,JDK1.2之後,該方法就被廢棄了。
為什麼stop()方法被廢棄而不被使用呢?原因是stop()方法太過於暴力,會強行把執行一半的執行緒終止。這樣會就不會保證執行緒的資源正確釋放,通常是沒有給與執行緒完成資源釋放工作的機會,因此會導致程式工作在不確定的狀態下。造成資料的不同步。
JDK1.2之後Java中通常使用interrupt()方法,停止一個執行緒。
但是,直接呼叫該方法不會終止一個正在執行的執行緒,需要加入一個判斷語句才可以完成執行緒的停止。例子如下:
package cn.thread.core;
/**
* 測試interrupt()方法
* @author 溫暖wk
* 結論:直接呼叫interrupt()方法,不能正確停止執行緒
* 分析:因為呼叫interrupt()方法不能立即停止執行緒,僅僅是在當前執行緒中打了一個停止的 *標記,並不是真的停止執行緒。
*/
public class Demo01 extends Thread {
//重寫run()方法
public void run() {
for(int i=0;i<50;i++) {
System.out.println("i="+(i+1));
}
}
public static void main(String[] args) {
Demo01 t1=new Demo01();//使用Java支援多執行緒的類建立執行緒t1
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
t1.interrupt();
}
}
所以,在使用interrupt()方法時,加入if語句判斷執行緒是否是停止狀態,如果是,則停止後面程式碼的執行。例子如下:
package cn.thread.core;
/**
* 使用異常,停止執行緒
* @author 溫暖wk
* 結論:能正確停止執行緒,且for迴圈後面的語句不會執行
* 使用丟擲異常的方法解決
*/
public class Demo03 extends Thread{
@Override
public void run() {
for(int i=0;i<500000;i++) {//只有迴圈足夠多,才能看到執行緒停止
if(this.interrupted()) {//用Threa.interrupted有什麼不同?
System.out.println("已經是停止狀態了!我要退出");
//break; for迴圈後面如果有語句會繼續執行
try {
throw new InterruptedException();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("i="+(i+1));
}
}
public static void main(String[] args) {
Demo03 t3=new Demo03();
t3.start(); //啟動一個執行緒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t3.interrupt();
System.out.println("end");
}
}