題目解析
答案選C
A:執行緒使用sleep()方法,讓執行緒掛起一段時間,並不是終止
B: 建立一個新執行緒時,對先前的執行緒沒有影響
C:拋出例外,執行緒終止
D: 並不是終止,而是搶佔,行程是資源分配的最基本單位,同一個行程所建立的不同執行緒共享這些資源,當某一個執行緒優先權比較高時,它就會搶佔其他執行緒的資源,導致其他執行緒沒有資源可用,會造成阻塞
1、run方法執行完成,執行緒正常結束
2、執行緒拋出一個未捕獲的Exception或Error
3 、直接呼叫該線程的Stop方法結束線程(不建議使用,容易導致死鎖)
線程結束的三種方法
①使用標誌位退出執行緒
②使用stop方法強制終止執行緒
③使用interrupt終止執行緒
一般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 } } }
#程式中可以直接使用thread.stop()來強行終止線程,但是stop 方法是很危險的,就像突然關閉電腦電源,而不是按正常程式關機一樣,可能會產生不可預料的結果,不安全主要是: thread.stop()呼叫之後,建立子執行緒的執行緒就會拋出ThreadDeatherror 的錯誤,並且會釋放子執行緒所持有的所有鎖。
當執行緒處於兩種狀態時,使用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中文網其他相關文章!