Java線程在什么情況下可以終止
哪些情況可以終止線程的進(jìn)行

題目解析
答案選C
A:線程使用sleep()方法,使線程掛起一段時間,并不是終止
B: 創(chuàng)建一個新線程時,對之前的線程沒有影響
C:拋出一個例外,線程終止
D: 并不是終止,而是搶占,進(jìn)程是資源分配的最基本單位,同一個進(jìn)程創(chuàng)建的不同線程共享這些資源,當(dāng)某一個線程優(yōu)先級比較高時,它就會搶占其他線程的資源,導(dǎo)致其他線程沒有資源可用,會造成阻塞
線程結(jié)束的三個原因
1、run方法執(zhí)行完成,線程正常結(jié)束
2、線程拋出一個未捕獲的Exception或者Error
3、直接調(diào)用該線程的Stop方法結(jié)束線程(不建議使用,容易導(dǎo)致死鎖)
具體分析
線程結(jié)束的三種方法
①使用標(biāo)志位退出線程
②使用stop方法強(qiáng)制終止線程
③使用interrupt終止線程
1、使用標(biāo)志位推出線程
一般 run()方法執(zhí)行完,線程就會正常結(jié)束,然而,常常有些線程是伺服線程。它們需要長時間的運(yùn)行,就要使用一個變量控制循環(huán)
定義了一個退出標(biāo)志 exit,當(dāng) exit 為 true 時,while 循環(huán)退出,exit 的默認(rèn)值為 false.在定義 exit 時,使用了一個 Java 關(guān)鍵字 volatile,這個關(guān)鍵字的目的是使 exit 同步,同一時刻只 能由一個線程來修改 exit 的值
public class ThreadSafe extends Thread {
public volatile boolean exit = false;
public void run() {
while (!exit){
//do something
}
}
}2、使用stop方法強(qiáng)制終止線程
程序中可以直接使用 thread.stop()來強(qiáng)行終止線程,但是 stop 方法是很危險的,就象突然關(guān) 閉計算機(jī)電源,而不是按正常程序關(guān)機(jī)一樣,可能會產(chǎn)生不可預(yù)料的結(jié)果,不安全主要是: thread.stop()調(diào)用之后,創(chuàng)建子線程的線程就會拋出ThreadDeatherror 的錯誤,并且會釋放子 線程所持有的所有鎖。
3、使用interrupt終止線程
當(dāng)線程處于兩種狀態(tài)時,使用interrpt終止
(1)線程未處于阻塞狀態(tài):
使用 isInterrupted()判斷線程的中斷標(biāo)志來退出循環(huán),再使用 interrupt()方法時,中斷標(biāo)志就會置 true,和使用自定義的標(biāo)志來控制循環(huán)是一樣的
public class MyThread extends Thread {
@Override
public void run() {
try {
for (int i = 0; i < 500000; i++) {
if (interrupted()) {
System.out.println("已經(jīng)是停止?fàn)顟B(tài)了");
throw new InterruptedException();//中斷異常
}
System.out.println("i=" + (i + 1));
}
System.out.println("我在for下面");
} catch (InterruptedException e) {
System.out.println("進(jìn)run方法中的catch了!");
e.printStackTrace();
}
}
}
(2)線程處于阻塞狀態(tài):如使用了sleep方法,同步鎖的 wait,socket 中的 receiver,accept 等方法時,調(diào)用線程的 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秒之內(nèi)按任意鍵中斷線程!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("線程已經(jīng)退出!");
}到此這篇關(guān)于Java線程在什么情況下可以終止的文章就介紹到這了,更多相關(guān)Java線程終止內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)的mysql事務(wù)處理操作示例
這篇文章主要介紹了Java實現(xiàn)的mysql事務(wù)處理操作,結(jié)合實例形式較為詳細(xì)的分析了Java基于JDBC操作mysql數(shù)據(jù)庫實現(xiàn)事務(wù)處理的相關(guān)概念、操作技巧與注意事項,需要的朋友可以參考下2018-08-08
Java+MySql圖片數(shù)據(jù)保存與讀取的具體實例
之前一直沒有做過涉及到圖片存儲的應(yīng)用,最近要做的東東涉及到了這個點,就做了一個小的例子算是對圖片存儲的初試吧2013-06-06
SpringBoot整合ShardingSphere的示例代碼
本文主要介紹了SpringBoot整合ShardingSphere的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Java struts2 validate用戶登錄校驗功能實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java struts2 validate用戶登錄校驗功能實現(xiàn)的具體步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
Java畢業(yè)設(shè)計實戰(zhàn)之二手書商城系統(tǒng)的實現(xiàn)
這是一個使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP開發(fā)的二手書商城系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有在線書城該有的所有功能,感興趣的朋友快來看看吧2022-01-01

