首頁  >  文章  >  Java  >  Java執行緒終止的幾種方式及實例分析

Java執行緒終止的幾種方式及實例分析

WBOY
WBOY轉載
2023-04-27 10:31:071636瀏覽

Java執行緒終止的幾種方式及實例分析

題目解析

答案選C

A:執行緒使用sleep()方法,讓執行緒掛起一段時間,並不是終止

B: 建立一個新執行緒時,對先前的執行緒沒有影響

C:拋出例外,執行緒終止

D: 並不是終止,而是搶佔,行程是資源分配的最基本單位,同一個行程所建立的不同執行緒共享這些資源,當某一個執行緒優先權比較高時,它就會搶佔其他執行緒的資源,導致其他執行緒沒有資源可用,會造成阻塞

執行緒結束的三個原因

1、run方法執行完成,執行緒正常結束

2、執行緒拋出一個未捕獲的Exception或Error

3 、直接呼叫該線程的Stop方法結束線程(不建議使用,容易導致死鎖)

具體分析

線程結束的三種方法

①使用標誌位退出執行緒

②使用stop方法強制終止執行緒

③使用interrupt終止執行緒

1、使用標誌位元推出執行緒

一般run()方法執行完,執行緒就會正常結束,然而,常常有些執行緒是伺服執行緒。它們需要長時間的運行,就要使用一個變數控制循環

定義了一個退出標誌exit,當exit 為true 時,while 循環退出,exit 的預設值為false.在定義exit 時,使用了一個Java 關鍵字volatile,這個關鍵字的目的是讓exit 同步,同一時刻只能由一個執行緒來修改exit 的值

public class ThreadSafe extends Thread {
  public volatile boolean exit = false; 
    public void run() { 
     while (!exit){
     //do something
     }
  } 
}

2、使用stop方法強制終止執行緒

#程式中可以直接使用thread.stop()來強行終止線程,但是stop 方法是很危險的,就像突然關閉電腦電源,而不是按正常程式關機一樣,可能會產生不可預料的結果,不安全主要是: thread.stop()呼叫之後,建立子執行緒的執行緒就會拋出ThreadDeatherror 的錯誤,並且會釋放子執行緒所持有的所有鎖。

3、使用interrupt終止執行緒

當執行緒處於兩種狀態時,使用interrpt終止

(1)執行緒未處於阻塞狀態:

使用isInterrupted()判斷執行緒的中斷標誌來退出迴圈,再使用interrupt()方法時,中斷標誌就會置true,和使用自訂的標誌來控制迴圈是一樣的

public class MyThread extends Thread {
    @Override
    public void run() {
        try {
            for (int i = 0; i < 500000; i++) {
                if (interrupted()) {
                    System.out.println("已经是停止状态了");
                    throw new InterruptedException();//中断异常
                }
                System.out.println("i=" + (i + 1));
            }
            System.out.println("我在for下面");
        } catch (InterruptedException e) {
            System.out.println("进run方法中的catch了!");
            e.printStackTrace();
        }
 
    }
}

(2)執行緒處於阻塞狀態:如使用了sleep方法,同步鎖的wait,socket 中的receiver,accept 等方法時,呼叫執行緒的interrupt()方法

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("线程已经退出!");  
    }

以上是Java執行緒終止的幾種方式及實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除