1. 程式人生 > >停止執行緒的三種方法

停止執行緒的三種方法

在Java中有以下3種方法可以終止正在執行的執行緒:
1. 拋異常法;
2. 使用stop方法強行終止執行緒
3. 使用interrupt方法中斷執行緒
下面分別對它們進行介紹:
一、拋異常法
拋異常法:顧名思義就是通過丟擲一個異常,然後再捕獲異常,從而跳過後面要繼續執行的語句,達到終止執行緒的目的。使用拋異常法首先要判斷該執行緒是否是停止狀態,只有是停止狀態才拋異常。
下面是具體示例:

package com.vhqimk.thread;

/*
 * 測試通過拋異常終止執行緒的情況
 */
public class Test {
    public static
void main(String[] args) { try { MyThread myThread = new MyThread(); myThread.start(); myThread.sleep(2000); myThread.interrupt(); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } } } class
MyThread extends Thread {
public void run() { super.run(); try { for (int i = 0; i < 500000; i++) { if (this.interrupted()) { System.out.println("已經是停止狀態了!我要退出了!"); throw new InterruptedException(); } System.out.println("i="
+ (i + 1)); } System.out.println("我在for下面"); } catch (InterruptedException e) { System.out.println("進MyThread類run方法中的catch了!"); e.printStackTrace(); } System.out.println("end!"); } }

執行結果如圖 1-7所示
這裡寫圖片描述
圖 1-7 執行結果

二、使用stop暴力停止
使用stop()方法停止執行緒則是非常暴力的,而且stop是作廢過期的方法,因此不推薦使用這種方法。
下面是程式碼示例

package com.vhqimk.thread;

/*
 * 測試stop方法終止執行緒的情況
 */
public class Test {
    public static void main(String[] args) {

        try {
            MyThread myThread = new MyThread();
            myThread.start();
            myThread.sleep(8000);
            myThread.stop();
        } catch (InterruptedException e) {

            e.printStackTrace();
        }

    }
}

class MyThread extends Thread {
    private int i = 0;

    public void run() {
        super.run();
        try {
            while (true) {
                i++;
                System.out.println("i=" + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end!");
    }
}

執行結果如圖 1-8所示
這裡寫圖片描述
圖 1-8 執行緒被暴力停止(stop)執行後圖標呈灰色

三、使用interrupt方法中斷執行緒
將方法interrupt()與return結合使用也能實現停止執行緒的效果,下面是具體示例:

package com.vhqimk.thread;

/*
 * 測試interrupt方法終止執行緒的情況
 */
public class Test {
    public static void main(String[] args) throws InterruptedException {

        MyThread myThread = new MyThread();
        myThread.start();
        Thread.sleep(8000);
        myThread.interrupt();

    }
}

class MyThread extends Thread {
    private int i = 0;

    public void run() {

        while (true) {
            if (this.isInterrupted()) {
                System.out.println("停止了!");
                return;

            }
            System.out.println("timer=" + System.currentTimeMillis());
        }

    }
}

執行結果如圖 1-9所示
這裡寫圖片描述
圖 1-9 成功停止執行

總結:停止執行緒有三種方法,建議使用“拋異常”法來實現執行緒的停止,因為在catch塊中可以對異常資訊進行相關的處理,而且使用異常流能更好、更方便地控制程式的執行流程,不會像第三種方法那樣出現多個return,造成汙染,也不建議用stop方法強行終止執行緒,因為使用它可能產生不可預料的結果。

(正在學習高洪巖先生著的《java多執行緒程式設計核心技術》,例子摘自此書,有興趣的可以查閱此書)