1. 程式人生 > >Java如何正確停止執行緒?

Java如何正確停止執行緒?

在多執行緒開發時,停止執行緒是很重要的一個技術,因此,如何正確停止一個執行緒,對於從事多執行緒開發的人員是很重要且十分必要的。
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");
    }

}