1. 程式人生 > >監控執行緒池中的執行緒發生未捕獲異常自動重啟功能

監控執行緒池中的執行緒發生未捕獲異常自動重啟功能

       之前專案要實現一個多執行緒發簡訊的功能,每個執行緒都對應一個kafka消費topic,但是偶爾會由於傳過來的資料或是資料庫的原因發生異常,之前為了專案趕進度都是用的try,catch捕獲的Exception異常直接處理掉了,最近有時間了感覺這樣很low,也很不專業,所以想重構一下程式碼,也上網查了很多資料(網上很多資料都是捕獲異常後直接new Thread().start(),但是專案要求動態啟動異常執行緒,直接new肯定是不合理的,也不滿足需求的),買了關於多執行緒的書,最後決定用執行緒自帶的未捕獲異常類這個方案。

       之前遇到問題都是在網上查的,學習了很多網上的大神的成果,這是我的第二篇部落格,我希望我慢慢也可以有自己的獨立思考體系。

       好了,下面我來講講這個功能實現的過程,如有不足請大家指正!

最初是想建立一個能容納7個執行緒的執行緒池,再給執行緒池配置一個執行緒工廠,執行緒工程負責給執行緒池中的執行緒配置異常捕獲物件,異常捕獲物件裡面再配置執行緒池,直接將傳過來的執行緒放進執行緒池進行重啟。

執行緒池配置:

 

執行緒工廠配置:


異常捕獲類配置:

 

經過週末兩天的糾結,最後終於想出了一個方案,由於每個執行緒是一個消費者執行緒,對應接收一個topic的資料,因此將topic作為一個引數先傳給執行緒工廠物件,執行緒工廠再傳給異常捕獲物件,這樣就能在異常捕獲類中根據不同的topic啟動不同的執行緒了。但是這裡面涉及到一個問題,

就是每個執行緒池物件裡面的執行緒都共享一個執行緒工廠

我們每次對執行緒池中執行緒工廠的操作都是在操作同一個執行緒工廠物件,導致後續測試的時候會出現紊亂的情況,就是明明出現異常的是執行緒1,但是執行緒工廠傳給異常捕獲物件的topic卻是最後一個提交給執行緒池的執行緒7的名稱,導致異常訊息是執行緒1的,重新啟動的卻是執行緒7,為了解決這個問題,只能建立7個newSingleThreadExecutor執行緒池,這樣7個執行緒,對應7個執行緒池,7個執行緒工廠,7個異常捕獲物件,每個都是單獨的一套,就不會出現紊亂了。修改之後的方案配置如下:

執行緒池配置:


customerFactory負責建立Runnable任務。

執行緒工廠配置:


異常捕獲類配置:


經過驗證目前為止還沒出現任何問題。

當然還有另外一種方法,就是不用執行緒池,也不用執行緒工廠,直接給每個執行緒配置未捕獲異常物件:


這樣當然也可以,只是第一種方式可擴充套件性比較大,後續如果一個topic想開多個執行緒,那麼執行緒池就可以進行擴充套件,執行緒工廠也可以對執行緒進行一些別的加工動作。

以上就是我的一些總結,對於上面提到的兩個執行緒池比較深刻的問題,後續等我完全研究明白了,會自動更新的。

相關推薦

監控執行執行發生捕獲異常自動功能

       之前專案要實現一個多執行緒發簡訊的功能,每個執行緒都對應一個kafka消費topic,但是偶爾會由於傳過來的資料或是資料庫的原因發生異常,之前為了專案趕進度都是用的try,catch捕獲的Exception異常直接處理掉了,最近有時間了感覺這樣很low,也很不專

定製在排程執行執行的任務

Java 9併發程式設計指南 目錄 定製在排程執行緒池中執行的任務 準備工作 實現過程 工作原理 擴充套件學習 更多關注 排程執行緒池是Executor框架基本執行緒池的擴充套件,排程在一段時間後執行任務。ScheduledTh

java設定執行執行的名字

專案中使用ThreadPoolExecutor進行多執行緒開發。使用起來很方便,但是當用jstack檢視堆疊資訊或者Jprofiler除錯效能的時候,看到的執行緒都是pool-1-thread-1\2\3\4之類的。如果一個系統中用到了多個執行緒池,就無法區分哪個執行緒造

sparkexecutor執行Driver傳送的task,放入執行執行原理

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPool { public static void main(

Android App多程序問題:捕獲異常資訊並重應用

 App crash原因以及解決辦法- https://blog.csdn.net/yangtuxiaojie/article/details/47123243 Android在程式崩潰或者捕獲異常之後重新啟動app- https://www.cnblogs.com/din

cloudstack私有雲監控虛擬機狀態,異常自動虛擬機

p地址 權限 風險 list 之前 自己 idea 天都 網卡 背景:   由於某項目的虛擬機均為Windows Server,並且經常出現藍屏狀態(有的幾乎每天都需要重啟),作為該項目的運維,甲方要求春節期間每天7點進行巡檢,發現異常的及時處理。春節期間WTF,一百個不樂

執行執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

java執行以程式碼的順序執行,主要是記錄一下繼承執行的內容

1.這個是自定義的執行緒池類,直接上程式碼 package org.jimmy.threadtest20181121; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecut

執行使用ThreadLocal方案

人工手打,翻譯自:https://moelholm.com/2017/07/24/spring-4-3-using-a-taskdecorator-to-copy-mdc-data-to-async-threads 本來想自己寫一篇關於執行緒池threadlocal的,偶然看到這篇文章覺得挺好的,便直接翻譯了

Java執行submit()和execute之間的區別?

一: submit()方法,可以提供Future < T > 型別的返回值。 executor()方法,無返回值。 execute無返回值 public void execute(Runnable command) { if (command == null)

執行的柵欄

多執行緒中有三個類,分別是CountDownLatch,CyclicBarrier,Semaphore。代表著執行緒中的柵欄。共享鎖。 CountDownLatch 在一組執行緒中,一個執行緒等待其他執行緒。我把它理解為門栓。 檢視該類的資料結構圖如下圖一 ​ 圖一 有一個靜態的內部類,Sync繼承自A

Java執行的核心執行是如何被重複利用的

在Java開發中,經常需要建立執行緒去執行一些任務,實現起來也非常方便,但如果併發的執行緒數量很多,並且每個執行緒都是執行一個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷燬執行緒需要時間。此時,我們很自然會想到使用執行緒池來解決這個問題。 使用執行緒池的好處

C#控制執行執行順序

在使用執行緒池時,當用執行緒池執行多個任務時,由於執行的任務時間過長,會導制兩個任務互相執行,如果兩個任務具有一定的操作順序,可能會導制不同的操作結果,這時,就要將執行緒池按順序操作。下面先給一段程式碼,該程式碼是不按順序對執行緒池進行操作的,程式碼如下: using System; using

執行常用的阻塞佇列簡述

一、ArrayBlockingQueue 基於陣列的阻塞佇列,有界佇列,按照先進先出(FIFO)的形式,初始化是必須指定capacity.看一下原始碼: /**第一種構造方法,指定初始容量*/ public ArrayBlockingQueue(int capacity) {

C# 執行取消執行的三種方式

三種方式都使用CancellationToken,只是使用方式不同,有類似於採用全域性標誌位的方式 第一種 檢測IsCancellationRequested方式 static void AsyncOperation1(CancellationToken t

關於執行的阻塞佇列BlockingQueue

       接上篇文章https://blog.csdn.net/GoSaint/article/details/84345210        對於BlockingQueue阻塞佇列而言,常用在多執行緒生產者

如何等待java執行所有任務完成

一、等待執行緒池所有執行緒完成: 有時候我們需要等待java thread pool中所有任務完成後再做某些操作,如想要等待所有任務完成,僅需呼叫threadPool.awaitTermination

Java實現終止執行正在執行的定時任務

貼個廣告 樓主的部落格已全部搬遷至自己的部落格,感興趣的小夥伴請移步haifeiWu與他朋友們的部落格專欄 源於開發 最近專案中遇到了一個新的需求,就是實現一個可以動態新增定時任務的功能。說到這裡,有人可能會說簡單啊,使用quartz就好了,簡單粗暴。然而

Java執行(1)----執行基礎知識和CachedThreadPool

本文探討一下java中的執行緒池 首先,什麼是執行緒池? 執行緒池通過多個任務重用執行緒,執行緒建立的開銷就被分攤到了多個任務上,而且請求到達時執行緒已經存在,消除了等待執行緒建立帶來的延遲,使得程式

Java執行(2)——執行的幾個重要方法詳解

【內容摘要】 在java中,如果需要進行多執行緒程式設計,可以採用java自帶的執行緒池來實現,執行緒池對於我們新手來說是一個非常好的選擇,因為我們可以不用關心執行緒池中執行緒是如何排程的,避免在多執行緒程式設計過程產生死鎖等問題。在瞭解執行緒池的使用前,本文