一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Java中實現線程的超時中斷方法實例

Java中實現線程的超時中斷方法實例

2021-05-10 11:01占小狼 Java教程

之前在使用Java實現熔斷降級組件的時候,需要實現接口請求的超時中斷,通過查找相關資料了解了相關的方法,下面這篇文章主要給大家介紹了關于Java中實現線程的超時中斷的相關資料,需要的朋友可以參考下

背景

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

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

思路

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

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

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

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

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

實現

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

java" id="highlighter_702366">
?
1
2
3
4
5
6
7
8
9
10
11
12
runnable task = new runnable() {
 @override
 public void run() {
  try {
   thread.interrupt();
   // 取消定時器任務
   f.cancel();
  } catch (exception e) {
   logger.error("failed while ticking timerlistener", e);
  }
 }
};

doug lea大神提供的 scheduledthreadpoolexecutor 可以很好的滿足這個需求,通過 scheduleatfixedrate 方法可以很方便的實現在延遲指定時間之后執行提交的任務。

?
1
2
scheduledfuture<?> f = executor.scheduleatfixedrate(
task, timeout, timeout, timeunit.milliseconds);

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

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

?
1
2
3
4
5
6
7
thread.interrupted();
// 內部邏輯
public static boolean interrupted() {
 return currentthread().isinterrupted(true);
}
// 參數為true,可以清除中斷標識
private native boolean isinterrupted(boolean clearinterrupted);

執行當前線程(即請求線程)的isinterrupted方法。

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

總結

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

原文鏈接:https://www.jianshu.com/p/de77103b9ea7

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 我不卡影院手机在线观看 | 青青热久免费精品视频精品 | 久久re6热在线视频 久久AV喷吹AV高潮欧美 | 欧美大奶艳星 | 精品国产国产精2020久久日 | 亚洲男人的天堂网 | 免费午夜影片在线观看影院 | 亚洲国产资源 | 手机在线观看网站免费视频 | 蜜桃88av| 精品久久伦理中文字幕 | 2021国产精品成人免费视频 | 国产性片在线观看 | 成人国产精品视频 | 国产91 最新 在线 | 国产精品乱码高清在线观看 | 69午夜影院| 亚洲男女天堂 | 四虎影院com | 娇女的呻吟亲女禁忌h16 | 国产精品模特hd在线 | 精品国语对白精品自拍视 | 无套内射在线观看THEPORN | 91在线免费看 | 亚洲区在线播放 | 四虎影视库永久在线地址 | 99久久精品免费看国产高清 | 羲义嫁密着中出交尾gvg794 | 情欲满载2012美国dvd | 韩国丽卡三级作品 | 亚州在线| 国产精品成 | 亚洲欧洲日产v特级毛片 | 青草悠悠视频在线观看 | 日本午夜大片免费观看视频 | 亚洲天堂男人天堂 | 亚洲精品国产一区二区第一页 | 好湿好滑好硬好爽好深视频 | 99精品国产美女福到在线不卡 | 嫩草影院永久在线播放 | 国产女乱淫真高清免费视频 |