回覆列表
  • 1 # IT資訊i

    百度搜索圈T社群 免費行業影片教程 www.aiquanti.com

    終止執行緒的三種方法

    1. 使用退出標誌,使執行緒正常退出,也就是當run方法完成後執行緒終止。

    2. 使用stop方法強行終止執行緒(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。

    3. 使用interrupt方法中斷執行緒。

    1. 使用退出標誌終止執行緒

    當run方法執行完後,執行緒就會退出。但有時run方法是永遠不會結束的。如在服務端程式中使用執行緒進行監聽客戶端請求,或是其他的需要迴圈處理的任務。在這種情況下,一般是將這些任務放在一個迴圈中,如while迴圈。如果想讓迴圈永遠執行下去,可以使用while(true){……}來處理。但要想使while迴圈在某一特定條件下退出,最直接的方法就是設一個boolean型別的標誌,並透過設定這個標誌為true或false來控制while迴圈是否退出。下面給出了一個利用退出標誌終止執行緒的例子。

    package chapter2;

    public class ThreadFlag extends Thread

    {

    public volatile boolean exit = false;

    public void run()

    {

    while (!exit);

    }

    public static void main(String[] args) throws Exception

    {

    ThreadFlag thread = new ThreadFlag();

    thread.start();

    sleep(5000); // 主執行緒延遲5秒

    thread.exit = true; // 終止執行緒thread

    thread.join();

    System.out.println("執行緒退出!");

    }

    }

    在上面程式碼中定義了一個退出標誌exit,當exit為true時,while迴圈退出,exit的預設值為false.在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個執行緒來修改exit的值,

    2. 使用stop方法終止執行緒

    使用stop方法可以強行終止正在執行或掛起的執行緒。我們可以使用如下的程式碼來終止執行緒:

    thread.stop();

    雖然使用上面的程式碼可以終止執行緒,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程式關機一樣,可能會產生不可預料的結果,因此,並不推薦使用stop方法來終止執行緒。

    3. 使用interrupt方法終止執行緒

    使用interrupt方法來終端執行緒可分為兩種情況:

    (1)執行緒處於阻塞狀態,如使用了sleep方法。

    (2)使用while(!isInterrupted()){……}來判斷執行緒是否被中斷。

    在第一種情況下使用interrupt方法,sleep方法將丟擲一個InterruptedException例外,而在第二種情況下執行緒將直接退出。下面的程式碼演示了在第一種情況下使用interrupt方法。

    package chapter2;

    public class ThreadInterrupt extends Thread

    {

    public void run()

    {

    try

    {

    sleep(50000); // 延遲50秒

    }

    catch (InterruptedException e)

    {

    System.out.println(e.getMessage());

    }

    }

    public static void main(String[] args) throws Exception

    {

    Thread thread = new ThreadInterrupt();

    thread.start();

    System.out.println("在50秒之內按任意鍵中斷執行緒!");

    System.in.read();

    thread.interrupt();

    thread.join();

    System.out.println("執行緒已經退出!");

    }

    }

    上面程式碼的執行結果如下:

    在50秒之內按任意鍵中斷執行緒!

    sleep interrupted

    執行緒已經退出!

    在呼叫interrupt方法後, sleep方法丟擲異常,然後輸出錯誤資訊:sleep interrupted.

    注意:在Thread類中有兩個方法可以判斷執行緒是否透過interrupt方法被終止。一個是靜態的方法interrupted(),一個是非靜態的方法isInterrupted(),這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted可以用來判斷其他執行緒是否被中斷。因此,while (!isInterrupted())也可以換成while (!Thread.interrupted())。

  • 中秋節和大豐收的關聯?
  • 一句話來表達你2019年的小目標是什麼?