欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java多線程中的異常處理機(jī)制簡(jiǎn)析

 更新時(shí)間:2012年11月24日 14:11:39   作者:  
在java多線程程序中,所有線程都不允許拋出未捕獲的checked exception,也就是說(shuō)各個(gè)線程需要自己把自己的checked exception處理掉,需要了解的朋友可以參考下
在java多線程程序中,所有線程都不允許拋出未捕獲的checked exception,也就是說(shuō)各個(gè)線程需要自己把自己的checked exception處理掉。這一點(diǎn)是通過(guò)java.lang.Runnable.run()方法聲明(因?yàn)榇朔椒暶魃蠜](méi)有throw exception部分)進(jìn)行了約束。但是線程依然有可能拋出unchecked exception,當(dāng)此類異常跑拋出時(shí),線程就會(huì)終結(jié),而對(duì)于主線程和其他線程完全不受影響,且完全感知不到某個(gè)線程拋出的異常(也是說(shuō)完全無(wú)法catch到這個(gè)異常)。JVM的這種設(shè)計(jì)源自于這樣一種理念:“線程是獨(dú)立執(zhí)行的代碼片斷,線程的問(wèn)題應(yīng)該由線程自己來(lái)解決,而不要委托到外部?!被谶@樣的設(shè)計(jì)理念,在Java中,線程方法的異常(無(wú)論是checked還是unchecked exception),都應(yīng)該在線程代碼邊界之內(nèi)(run方法內(nèi))進(jìn)行try catch并處理掉.

但如果線程確實(shí)沒(méi)有自己try catch某個(gè)unchecked exception,而我們又想在線程代碼邊界之外(run方法之外)來(lái)捕獲和處理這個(gè)異常的話,java為我們提供了一種線程內(nèi)發(fā)生異常時(shí)能夠在線程代碼邊界之外處理異常的回調(diào)機(jī)制,即Thread對(duì)象提供的setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法。

通過(guò)該方法給某個(gè)thread設(shè)置一個(gè)UncaughtExceptionHandler,可以確保在該線程出現(xiàn)異常時(shí)能通過(guò)回調(diào)UncaughtExceptionHandler接口的public void uncaughtException(Thread t, Throwable e) 方法來(lái)處理異常,這樣的好處或者說(shuō)目的是可以在線程代碼邊界之外(Thread的run()方法之外),有一個(gè)地方能處理未捕獲異常。但是要特別明確的是:雖然是在回調(diào)方法中處理異常,但這個(gè)回調(diào)方法在執(zhí)行時(shí)依然還在拋出異常的這個(gè)線程中!

比之上述方法,還有一種編程上的處理方式可以借鑒,即,有時(shí)候主線程的調(diào)用方可能只是想知道子線程執(zhí)行過(guò)程中發(fā)生過(guò)哪些異常,而不一定會(huì)處理或是立即處理,那么發(fā)起子線程的方法可以把子線程拋出的異常實(shí)例收集起來(lái)作為一個(gè)Exception的List返回給調(diào)用方,由調(diào)用方來(lái)根據(jù)異常情況決定如何應(yīng)對(duì)。不過(guò)要特別注意的是,此時(shí)子線程早以終結(jié)。

相關(guān)文章

最新評(píng)論