http://m.survivalescaperooms.com/luochengor/archive/2011/08/11/2134818.html
這篇文章應(yīng)該是Thinking in java 中文版中的一段,關(guān)于線程-守護(hù)線程(Daemon Thread)的介紹
可能是我理解de不好,我對(duì)書對(duì)于daemon thread 中的finally是否執(zhí)行的介紹有點(diǎn)迷糊了,故自己寫個(gè)方法測(cè)試之后才搞明白。
就拿書中的例子做進(jìn)一步說(shuō)明。先來(lái)看下原文:不看我的羅嗦,可以直接看文章結(jié)尾的結(jié)論。
import java.util.concurrent.TimeUnit;/** * Finally shoud be always run ? */public class DaemonsDontRunFinally { public static void main(String[] args) { Thread t = new Thread(new ADaemon()); t.setDaemon(true); t.start(); }}class ADaemon implements Runnable { public void run() { try { System.out.); TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { System.out.println("Exiting via InterruptedException"); } finally { System.out.println("This shoud be always run ?"); } }}運(yùn)行結(jié)果:
start ADaemon...
如果將main函數(shù)中的t.setDaemon(true);注釋掉,運(yùn)行結(jié)果如下:
start ADaemon...
This shoud be always run ?
-----------------------------------------------------------------------
而我實(shí)際運(yùn)行的結(jié)果不是這樣的,實(shí)際是:
t 是 daemon 線程時(shí),什么都不輸出
t 不是daemon 線程時(shí),輸出
start ADaemon...
This shoud be always run ?
看完書中所述,給我的理解是daemon線程類中的finally代碼塊都不會(huì)得到執(zhí)行(當(dāng)然我對(duì)此是懷疑的)
開始測(cè)試,我讓main方法結(jié)束前 sleep 10秒,看到當(dāng)t是守護(hù)線程時(shí),finally的代碼塊是執(zhí)行的。
繼續(xù)測(cè)試,我讓main方法結(jié)束前sleep 1秒,finally的代碼塊也是不執(zhí)行的(daemon 線程也是sleep 1秒)
所以我得到以下結(jié)論:
runnable實(shí)現(xiàn)類中的run方法中如果含有finally代碼塊,如果執(zhí)行該類實(shí)例的線程是守護(hù)線程(daemon thread),finally代碼塊有可能是不會(huì)得到執(zhí)行的,但也有可能會(huì)執(zhí)行,
那就是文中提到的 如果用戶線程已經(jīng)全部退出運(yùn)行了,只剩下守護(hù)線程存在了,虛擬機(jī)也就退出了,finally代碼塊即可能沒(méi)有機(jī)會(huì)執(zhí)行了。
所以守護(hù)線程中一般不要去對(duì)文件、數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)等資源進(jìn)行操作,以免資源文件來(lái)不及釋放,造成死鎖。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注