成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

線程池監控:執行超時、等待超時;執行超時數量、等待超時數量

開發 前端
線程池 ThreadPoolExecutor 為了提供擴展,提供了兩個方法 beforeExecute 和 afterExecute,每個任務執行前后都會調用這兩個方法,相當于對線程任務的執行做了一個切面。

?監控線程池:執行超時、等待超時;執行超時數量、等待超時數量;

擴展線程池 ThreadPoolExecutor 的兩個方法 beforeExecute 和 afterExecute

自定義Runnable 記錄關鍵節點時間

關鍵時間節點參數:

  • 任務創建(提交)時間:submitTime
  • 任務開始執行時間:startExeTime
  • 任務結束執行時間:endExeTime
  • 任務在隊列等待時間:任務開始執行時間 - 任務創建(提交)時間
  • 任務執行總時間:任務結束執行時間 - 任務開始執行時間

源碼分析

線程池 ThreadPoolExecutor 為了提供擴展,提供了兩個方法 beforeExecute 和 afterExecute,每個任務執行前后都會調用這兩個方法,相當于對線程任務的執行做了一個切面。

public class ThreadPoolExecutor extends AbstractExecutorService {
/**
* @param t 執行任務的線程
* @param
protected void beforeExecute(Thread t, Runnable r){ }

/**
* @param r 將要被執行的任務
* @param
protected void afterExecute(Runnable r, Throwable t){ }
}

源碼執行邏輯:

線程池擴展代碼:

public class ThreadPoolExpandTest {
// 定義線程池
public static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(
2,
4,
60,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(5),
new ThreadPoolExecutor.DiscardOldestPolicy()
){
@Override
/**
* @param t 執行任務的線程
* @param
protected void beforeExecute(Thread t, Runnable r){
System.out.println("beforeExecute將要被執行");
}

/**
* @param r 將要被執行的任務
* @param
@Override
protected void afterExecute(Runnable r, Throwable t){
System.out.println("afterExecute已經執行完畢");
}
};
public static void main(String[] args){
poolExecutor.execute(()->{
System.out.println("任務執行");
});
}
}

運行結果:

beforeExecute執行
任務執行
afterExecute執行

總結:從測試代碼可以看出,通過擴展線程池參數可以進行任務執行的監控。

自定義Runnable

通過自定義Runnable,記錄任務執行的一些時間:

  • 任務創建(提交)時間
  • 任務開始執行時間
public class DynamicRunnable implements Runnable{
/**
* runnable
*/
private final Runnable runnable;
/**
* 任務創建(提交)時間
*/
private final Long submitTime;
/**
* 任務開始執行時間
*/
private Long startExeTime;

public DynamicRunnable(Runnable runnable){
this.runnable = runnable;
submitTime = System.currentTimeMillis();
}

@Override
public void run(){
runnable.run();
}

public Long getSubmitTime(){
return submitTime;
}

public void setStartExeTime(Long startExeTime){
this.startExeTime = startExeTime;
}

public Long getStartExeTime(){
return startExeTime;
}
}

繼承線程池+自定義Runnable

核心參數:

/**
* 執行超時,單位(毫秒)
*/
private long runTimeout;

/**
* 等待超時,單位(毫秒)
*/
private long queueTimeout;

/**
* 執行超時數量
*/
private final AtomicInteger runTimeoutCount = new AtomicInteger();

/**
* 等待超時數量
*/
private final AtomicInteger queueTimeoutCount = new AtomicInteger();

重寫ThreadPoolExecutor方法:

@Override
public void execute(Runnable command){
if (runTimeout > 0 || queueTimeout > 0) {
// 記錄任務提交時間
command = new DynamicRunnable(command);
}
super.execute(command);
}
@Override
protected void beforeExecute(Thread t, Runnable r){
if (!(r instanceof DynamicRunnable)) {
super.beforeExecute(t, r);
return;
}
DynamicRunnable runnable = (DynamicRunnable) r;
long currTime = System.currentTimeMillis();
if (runTimeout > 0) {
// 記錄任務開始執行時間
runnable.setStartExeTime(currTime);
}
if (queueTimeout > 0) {
// 任務開始執行時間 - 任務創建(提交)時間
long waitTime = currTime - runnable.getSubmitTime();
if (waitTime > queueTimeout) {
log.error("{} execute queue timeout waitTime: {}ms", this.getThreadPoolName(),waitTime);
}
}
super.beforeExecute(t, r);
}
@Override
protected void afterExecute(Runnable r, Throwable t){
if (runTimeout > 0) {
DynamicRunnable runnable = (DynamicRunnable) r;
// 任務執行總時間:任務結束執行時間 - 任務開始執行時間
long runTime = System.currentTimeMillis() - runnable.getStartExeTime();
if (runTime > runTimeout) {
runTimeoutCount.incrementAndGet();
log.error("{} execute, run timeout runTime: {}ms", this.getThreadPoolName(), runTime);
}
}
super.afterExecute(r, t);
}

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2020-04-23 11:43:55

MySQL數據庫SQL

2017-08-30 17:21:05

LinuxShell超時現象

2009-06-11 16:44:06

超時控制Java線程

2012-02-15 13:26:39

JavaJava Socket

2021-02-22 17:18:35

MySQLSQL行鎖

2009-07-21 14:32:51

ASP.NET進程模型

2013-04-03 11:07:46

JavaJava線程

2024-04-30 12:56:00

多線程.NET

2017-06-04 16:24:27

線程線程池中斷

2012-08-09 09:11:32

PHP超時

2014-03-18 13:27:55

Redis數據存儲

2021-07-01 09:42:08

Redisson分布式

2024-02-26 08:50:37

訂單自動取消消息

2010-11-25 11:15:11

MySQL查詢超時

2021-11-15 12:42:25

C# 定位gRPC

2024-12-26 12:59:39

2016-08-04 14:41:21

架構java服務端開發

2022-10-14 08:18:07

Guavaweb應用

2010-11-08 15:21:17

SQL Server連

2010-10-14 09:15:20

MySQL查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲黄色成人网 | 在线观看国产网站 | 国产激情视频在线观看 | 婷婷开心激情综合五月天 | 欧美午夜一区 | 国产精品a免费一区久久电影 | 性在线| 成人精品一区二区三区中文字幕 | 色综合一区 | 国产精品3区 | 日本视频一区二区三区 | 亚洲成人福利在线观看 | 国产69精品久久久久777 | 欧美日韩国产一区二区三区 | 成人在线免费观看 | 91视视频在线观看入口直接观看 | 伊人亚洲 | 美女久久久久久久 | 国产成人精品久久二区二区91 | av片免费| 国产综合区| 精品欧美一区免费观看α√ | 国产精品a久久久久 | 色视频www在线播放国产人成 | 大象视频一区二区 | 久久国产一区二区 | 免费黄色的网站 | 国产精品呻吟久久av凹凸 | 久久精品日产第一区二区三区 | 中文字幕精品一区 | 久久久国产精品视频 | 国产毛片久久久久久久久春天 | 欧美在线视频免费 | 伦理午夜电影免费观看 | 免费观看的黄色网址 | 亚洲国产精品一区 | 性色的免费视频 | 久久精品这里精品 | 亚洲a视频 | 国产999精品久久久久久 | 国产精品高潮呻吟久久 |