成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java中斷異常 InterruptedException 的正確處理方式

diabloneo / 2118人閱讀

摘要:首先,需要了解為一個(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

相關(guān)文章

  • Java多線程筆記(一):JMM與基礎(chǔ)關(guān)鍵字

    摘要:當(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è)操作是不可中斷的。即使是在多...

    cyixlq 評論0 收藏0
  • Java多線程之線程創(chuàng)建、中斷、狀態(tài)與屬性

    摘要:中斷線程當(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接口...

    liangdas 評論0 收藏0
  • Java 多線程編程基礎(chǔ)——Thread 類

    摘要:程序執(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)行...

    zhoutk 評論0 收藏0
  • java取消線程實(shí)例

    摘要:正確方法通過中斷來取消線程。小結(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...

    andot 評論0 收藏0
  • Thread類源碼解讀(3)——線程中斷interrupt

    摘要:現(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í)也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...

    fevin 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<