摘要:首先,需要了解為一個(gè)方法為啥會(huì)是這個(gè)方法拋出中斷異常作為方法簽名的一部分以及調(diào)用正在調(diào)用的方法的可能結(jié)果。到目前為止,應(yīng)該清楚的是,做這件事是一個(gè)壞主意。選擇不同的接口,例如則可以拋出中斷異常,或者按照說的上面的第二種方法。
你看到這篇文件可能是因?yàn)槟阋呀?jīng)調(diào)用了一個(gè)拋出 InterruptedException 異常的方法,并且需要以某種方式處理它。
首先,需要了解為一個(gè)方法為啥會(huì) throws InterruptedException, 是這個(gè)方法拋出中斷異常作為方法簽名的一部分以及調(diào)用正在調(diào)用的方法的可能結(jié)果。因此,首先要接受一個(gè)事實(shí),InterruptedException 是這個(gè)方法調(diào)用的完全有效的結(jié)果。
現(xiàn)在,如果你正在調(diào)用的方法拋出此類異常,你的方法應(yīng)該怎么做?可以通過考慮以下問題找出答案:
你正在實(shí)現(xiàn)的方法是否有意義拋出異常 InterruptedException?換句話說,InterruptedException 異常是否是調(diào)用你的方法是一個(gè)明智的結(jié)果?
如果是,那么 throws InterruptedException 應(yīng)當(dāng)成為你的方法簽名,你應(yīng)該讓異常傳播(即不捕獲該異常的話)。
示例: 你的方法等待來自網(wǎng)絡(luò)的值以完成計(jì)算并返回結(jié)果。如果阻塞網(wǎng)絡(luò)調(diào)用拋出 InterruptedException方法無法以正常方式完成計(jì)算。你讓 InterruptedException 傳播。
int computeSum(Server server) throws InterruptedException { // Any InterruptedException thrown below is propagated int a = server.getValueA(); int b = server.getValueB(); return a + b; }
如果不是,那么你不應(yīng)該聲明你的方法 throws InterruptedException, 你應(yīng)該(必須?。┎东@異常。在這種情況下,現(xiàn)在要記住兩件事:
有人打斷了你的線程。這個(gè)人可能急于取消操作,優(yōu)雅地終止程序,或者其他什么。你應(yīng)該對那個(gè)人保持禮貌并且不用再費(fèi)力地從你的方法中返回。
即使你的方法可以設(shè)法讓出現(xiàn) InterruptedException 異常時(shí), 即在線程被中斷的情況下, 產(chǎn)生合理的返回值,線程被中斷過這件事仍然很重要。特別是,調(diào)用方法的代碼可能會(huì)對執(zhí)行方法期間是否發(fā)生中斷感興趣。您應(yīng)該通過設(shè)置中斷標(biāo)志來記錄發(fā)生中斷的事實(shí):即需要在 catch 里調(diào)用Thread.currentThread().interrupt() .
示例: 用戶要求打印兩個(gè)值的總和。如果無法計(jì)算總和,則打印“無法計(jì)算總和”(并且比由于一個(gè)導(dǎo)致程序因堆棧跟蹤而崩潰要好得多 InterruptedException)。換句話說,用這個(gè)方法聲明這個(gè)方法是沒有意義的throws InterruptedException。
void printSum(Server server) { try { int sum = computeSum(server); System.out.println("Sum: " + sum); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // set interrupt flag System.out.println("Failed to compute sum"); } }
到目前為止,應(yīng)該清楚的是,做這件事throw new RuntimeException(e)是一個(gè)壞主意。這對調(diào)用者來說不太禮貌。您可以發(fā)明一個(gè)新的運(yùn)行時(shí)異常,但根本原因(某人希望線程停止執(zhí)行)可能會(huì)丟失。
另一個(gè)例子:實(shí)施 Runnable
正如您可能已經(jīng)發(fā)現(xiàn)的那樣,簽名 Runnable.run 不允許重新拋出 InterruptedExceptions。好吧,你聲明了實(shí)現(xiàn) Runnable 接口,這意味著你已聲明處理可能的中斷異常問題。選擇不同的接口,例如Callable則可以拋出中斷異常(V call() throws Exception),或者按照說的上面的第二種方法。
還有一個(gè):調(diào)用 Thread.sleep
你正在嘗試讀取文件,規(guī)范說你應(yīng)該嘗試10次,間隔1秒。調(diào)用 Thread.sleep(1000)。所以,你需要處理 InterruptedException。對于一種方法 tryToReadFile 來說,如果說“如果我被打斷了,我無法完成嘗試閱讀文件的行為”這一方法非常有意義。換句話說,它對拋出的方法很有意義InterruptedExceptions。
String tryToReadFile(File f) throws InterruptedException { for (int i = 0; i < 10; i++) { if (f.exists()) return readFile(f); Thread.sleep(1000); } return null; }
作者:
Andreas Lundblad,理論計(jì)算機(jī)科學(xué)博士。在Oracle開發(fā)Java平臺(javac,javadoc,sjavac)工作了三年。安德烈亞斯是StackOverflow的Java標(biāo)簽的前10貢獻(xiàn)者.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72633.html
摘要:當(dāng)線程執(zhí)行完后進(jìn)入狀態(tài),表示線程執(zhí)行結(jié)束。其中和表示兩個(gè)線程。但要注意,讓出并不表示當(dāng)前線程不執(zhí)行了。關(guān)鍵字其作用是防止指令重排和使線程對一個(gè)對象的修改令其他線程可見。 JMM特性一覽 Java Memory Model的關(guān)鍵技術(shù)點(diǎn)都是圍繞著多線程的原子性、可見性和有序性來建立的。因此我們首先需要來了解這些概念。 原子性(Atomicity) 原子性是指一個(gè)操作是不可中斷的。即使是在多...
摘要:中斷線程當(dāng)線程的方法方法體執(zhí)行完畢自然終止或在方法中出現(xiàn)沒有捕獲的異常時(shí)意外終止,線程將終止。如果被中斷線程被阻塞,就無法檢測中斷狀態(tài),就會(huì)產(chǎn)生異常。 多進(jìn)程與多線程的本質(zhì)區(qū)別在于:每個(gè)進(jìn)程擁有自己的一整套變量,而線程則共享數(shù)據(jù)。如果需要執(zhí)行一個(gè)比較耗時(shí)的任務(wù),應(yīng)該使用獨(dú)立的線程。 可以通過實(shí)現(xiàn)Runnable接口或繼承Thread類來創(chuàng)建獨(dú)立的線程。 1) 實(shí)現(xiàn)Ruannable接口...
摘要:程序執(zhí)行時(shí),至少會(huì)有一個(gè)線程在運(yùn)行,這個(gè)運(yùn)行的線程被稱為主線程。程序的終止是指除守護(hù)線程以外的線程全部終止。多線程程序由多個(gè)線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會(huì)拋出異常。 線程 我們在閱讀程序時(shí),表面看來是在跟蹤程序的處理流程,實(shí)際上跟蹤的是線程的執(zhí)行。 單線程程序 在單線程程序中,在某個(gè)時(shí)間點(diǎn)執(zhí)行的處理只有一個(gè)。 Java 程序執(zhí)行時(shí),至少會(huì)有一個(gè)線程在運(yùn)行...
摘要:正確方法通過中斷來取消線程。小結(jié)調(diào)用并不意味著立即停止目標(biāo)線程正在進(jìn)行的工作,而只是傳遞了請求中斷的消息。在使用靜態(tài)的時(shí)應(yīng)該小心,因?yàn)樗鼤?huì)清除當(dāng)前線程的中斷狀態(tài)。 序 本文展示一個(gè)常見的取消線程的方法。 錯(cuò)誤實(shí)例 class BrokenPrimeProducer extends Thread { private final BlockingQueue queue; p...
摘要:現(xiàn)在終止一個(gè)線程,基本上只能靠曲線救國式的中斷來實(shí)現(xiàn)。中斷機(jī)制的核心在于中斷狀態(tài)和異常中斷狀態(tài)設(shè)置一個(gè)中斷狀態(tài)清除一個(gè)中斷狀態(tài)方法同時(shí)會(huì)返回線程原來的中斷的狀態(tài)。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個(gè)很重要的概念,通常,取消一個(gè)任務(wù)的執(zhí)行,最好的,同時(shí)也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...
閱讀 2012·2021-11-15 18:09
閱讀 903·2021-09-06 15:13
閱讀 2645·2021-08-23 09:43
閱讀 2026·2019-08-30 15:54
閱讀 2219·2019-08-30 13:56
閱讀 2486·2019-08-26 11:31
閱讀 3081·2019-08-26 10:56
閱讀 705·2019-08-26 10:28