停止線程的三種方法

在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多線程編程核心技術》,例子摘自此書,有興趣的可以查閱此書)

發佈了28 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章