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

Java中實現(xiàn)線程的超時中斷方法實例

 更新時間:2018年06月21日 08:20:55   作者:占小狼  
之前在使用Java實現(xiàn)熔斷降級組件的時候,需要實現(xiàn)接口請求的超時中斷,通過查找相關(guān)資料了解了相關(guān)的方法,下面這篇文章主要給大家介紹了關(guān)于Java中實現(xiàn)線程的超時中斷的相關(guān)資料,需要的朋友可以參考下

背景

之前在實現(xiàn)熔斷降級組件時,需要實現(xiàn)一個接口的超時中斷,意思是,業(yè)務(wù)在使用熔斷降級功能時,在平臺上設(shè)置了一個超時時間,如果在請求進入熔斷器開始計時,并且接口在超時時間內(nèi)沒有響應(yīng),則需要提早中斷該請求并返回。

比如正常下游接口的超時時間為800ms,但是因為自身業(yè)務(wù)的特殊需求,最多只能等200ms,如果200ms之內(nèi)沒有數(shù)據(jù)返回,則返回降級數(shù)據(jù)。這里處理請求的線程可以看成是tomcat線程池中的一個線程,如果通過線程池返回的Future,可以很輕松的實現(xiàn)超時返回,但是這種情況下,并不能拿到Futrue,需要換一種思路。

思路

中斷一個線程的思路有哪些?

除了已經(jīng)廢棄的Thread.stop, Thread.suspend, Thread.resume 方法,剩下的貌似只有一種方案了,就是調(diào)用當前線程的 interrupt() ,但是這個方法的作用并不是中斷線程,而是設(shè)置一個標識,通知該線程可以被中斷了,到底是繼續(xù)執(zhí)行,還是中斷返回,由線程本身自己決定。

具體來說,當對一個線程調(diào)用了 interrupt() 之后,如果該線程處于被阻塞狀態(tài)(比如執(zhí)行了wait、sleep或join等方法),那么會立即退出阻塞狀態(tài),并拋出一個 InterruptedException 異常,在代碼中catch這個異常進行后續(xù)處理。如果線程一直處于運行狀態(tài),那么只會把該線程的中斷標志設(shè)置為 true,僅此而已,所以 interrupt() 并不能真正的中斷線程,不過在rpc調(diào)用的場景中,請求線程一般都處于阻塞狀態(tài),等待數(shù)據(jù)返回,這時 interrupt() 方法是可以派上用場的。

那么,要實現(xiàn)指定超時時間內(nèi)中斷請求線程,還有最后一個問題需要解決:什么時候,由誰去執(zhí)行 interrupt() 方法?

必然這個方法只能由其它線程來執(zhí)行了(自己都阻塞了,執(zhí)行個鬼),而且是在請求進入熔斷器時,并在超時時間之后執(zhí)行,有點繞,比如超時時間是200ms,那么請求進入熔斷器之后,再過200ms,就執(zhí)行 interrupt() ,但是在200ms之內(nèi)有數(shù)據(jù)返回,那么就不執(zhí)行 interrupt() 了。

實現(xiàn)

需求已經(jīng)很明確了,相當于延遲執(zhí)行一個task,其內(nèi)部邏輯就是執(zhí)行請求線程的 interrupt() ,當然還有其它的邏輯。

Runnable task = new Runnable() {
 @Override
 public void run() {
  try {
   thread.interrupt();
   // 取消定時器任務(wù)
   f.cancel();
  } catch (Exception e) {
   logger.error("Failed while ticking TimerListener", e);
  }
 }
};

Doug Lea大神提供的 ScheduledThreadPoolExecutor 可以很好的滿足這個需求,通過 scheduleAtFixedRate 方法可以很方便的實現(xiàn)在延遲指定時間之后執(zhí)行提交的任務(wù)。

ScheduledFuture<?> f = executor.scheduleAtFixedRate(
task, timeout, timeout, TimeUnit.MILLISECONDS);

在請求進入熔斷器時,順便提交一個任務(wù)到線程池中等待執(zhí)行,如果接口在超時時間內(nèi)沒有返回,那么該任務(wù)會被觸發(fā),并執(zhí)行請求線程的 interrupt 方法,這樣就實現(xiàn)了請求線程的中斷(因為這時請求線程正在被阻塞,等待數(shù)據(jù)返回),另外需要清空定時任務(wù),不然這個任務(wù)會一直執(zhí)行。

如果接口正常返回了,也要記得清空定時任務(wù),并且在請求退出熔斷器的時候,記得恢復(fù)請求線程的中斷標識,如何恢復(fù)?在請求線程中執(zhí)行下面代碼即可。

Thread.interrupted();
// 內(nèi)部邏輯
public static boolean interrupted() {
 return currentThread().isInterrupted(true);
}
// 參數(shù)為true,可以清除中斷標識
private native boolean isInterrupted(boolean ClearInterrupted);

執(zhí)行當前線程(即請求線程)的isInterrupted方法。

使用這種方式實現(xiàn)請求的超時中斷,在QPS很高的情況下,會有額外的性能損失,因為每次請求都要提交一個任務(wù)到線程池中等待執(zhí)行。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Java Tree結(jié)構(gòu)數(shù)據(jù)中查找匹配節(jié)點方式

    Java Tree結(jié)構(gòu)數(shù)據(jù)中查找匹配節(jié)點方式

    這篇文章主要介紹了Java Tree結(jié)構(gòu)數(shù)據(jù)中查找匹配節(jié)點方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 基于MyBatis的parameterType傳入?yún)?shù)類型

    基于MyBatis的parameterType傳入?yún)?shù)類型

    這篇文章主要介紹了基于MyBatis的parameterType傳入?yún)?shù)類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Apache?Commons?BeanUtils:?JavaBean操作方法

    Apache?Commons?BeanUtils:?JavaBean操作方法

    這篇文章主要介紹了Apache?Commons?BeanUtils:?JavaBean操作的藝術(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Java使用通配符實現(xiàn)增強泛型詳解

    Java使用通配符實現(xiàn)增強泛型詳解

    泛型是JAVA重要的特性,使用泛型編程,可以使代碼復(fù)用率提高。本文將利用通配符實現(xiàn)增強泛型,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08
  • java注解實現(xiàn)websocket服務(wù)的兩種方式

    java注解實現(xiàn)websocket服務(wù)的兩種方式

    Java WebSocket是一種基于TCP協(xié)議的雙向全雙工消息傳輸技術(shù),它允許服務(wù)器和客戶端之間實時通信,具有低延遲和高效率的特點,下面這篇文章主要給大家介紹了關(guān)于java注解實現(xiàn)websocket服務(wù)的兩種方式,需要的朋友可以參考下
    2024-08-08
  • Spring Boot 實現(xiàn)圖片上傳并回顯功能

    Spring Boot 實現(xiàn)圖片上傳并回顯功能

    本篇文章給大家分享Spring Boot 實現(xiàn)圖片上傳并回顯功能,文中通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • Java創(chuàng)建student類詳細代碼例子

    Java創(chuàng)建student類詳細代碼例子

    這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建student類的相關(guān)資料,學(xué)生類(Student)是一種面向?qū)ο蟮木幊谈拍?其主要用于描述學(xué)生的屬性和行為,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • Java數(shù)組轉(zhuǎn)換為集合的相關(guān)方法

    Java數(shù)組轉(zhuǎn)換為集合的相關(guān)方法

    在Java中我們經(jīng)常需要將數(shù)組從一種類型轉(zhuǎn)換為另一種類型,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)組轉(zhuǎn)換為集合的相關(guān)方法,文中通過圖文及代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • this關(guān)鍵字詳解

    this關(guān)鍵字詳解

    這篇文章主要介紹了this關(guān)鍵字,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-03-03
  • 使用MyBatisPlus自動生成代碼后tomcat運行報錯的問題及解決方法

    使用MyBatisPlus自動生成代碼后tomcat運行報錯的問題及解決方法

    這篇文章主要介紹了使用MyBatisPlus自動生成代碼后tomcat運行報錯的問題及解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論