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

線程池監(jiān)控:執(zhí)行超時、等待超時;執(zhí)行超時數(shù)量、等待超時數(shù)量

開發(fā) 前端
線程池 ThreadPoolExecutor 為了提供擴(kuò)展,提供了兩個方法 beforeExecute 和 afterExecute,每個任務(wù)執(zhí)行前后都會調(diào)用這兩個方法,相當(dāng)于對線程任務(wù)的執(zhí)行做了一個切面。

?監(jiān)控線程池:執(zhí)行超時、等待超時;執(zhí)行超時數(shù)量、等待超時數(shù)量;

擴(kuò)展線程池 ThreadPoolExecutor 的兩個方法 beforeExecute 和 afterExecute

自定義Runnable 記錄關(guān)鍵節(jié)點時間

關(guān)鍵時間節(jié)點參數(shù):

  • 任務(wù)創(chuàng)建(提交)時間:submitTime
  • 任務(wù)開始執(zhí)行時間:startExeTime
  • 任務(wù)結(jié)束執(zhí)行時間:endExeTime
  • 任務(wù)在隊列等待時間:任務(wù)開始執(zhí)行時間 - 任務(wù)創(chuàng)建(提交)時間
  • 任務(wù)執(zhí)行總時間:任務(wù)結(jié)束執(zhí)行時間 - 任務(wù)開始執(zhí)行時間

源碼分析

線程池 ThreadPoolExecutor 為了提供擴(kuò)展,提供了兩個方法 beforeExecute 和 afterExecute,每個任務(wù)執(zhí)行前后都會調(diào)用這兩個方法,相當(dāng)于對線程任務(wù)的執(zhí)行做了一個切面。

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

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

源碼執(zhí)行邏輯:

線程池擴(kuò)展代碼:

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

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

運行結(jié)果:

beforeExecute執(zhí)行
任務(wù)執(zhí)行
afterExecute執(zhí)行

總結(jié):從測試代碼可以看出,通過擴(kuò)展線程池參數(shù)可以進(jìn)行任務(wù)執(zhí)行的監(jiān)控。

自定義Runnable

通過自定義Runnable,記錄任務(wù)執(zhí)行的一些時間:

  • 任務(wù)創(chuàng)建(提交)時間
  • 任務(wù)開始執(zhí)行時間
public class DynamicRunnable implements Runnable{
/**
* runnable
*/
private final Runnable runnable;
/**
* 任務(wù)創(chuàng)建(提交)時間
*/
private final Long submitTime;
/**
* 任務(wù)開始執(zhí)行時間
*/
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

核心參數(shù):

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

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

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

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

重寫ThreadPoolExecutor方法:

@Override
public void execute(Runnable command){
if (runTimeout > 0 || queueTimeout > 0) {
// 記錄任務(wù)提交時間
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) {
// 記錄任務(wù)開始執(zhí)行時間
runnable.setStartExeTime(currTime);
}
if (queueTimeout > 0) {
// 任務(wù)開始執(zhí)行時間 - 任務(wù)創(chuàng)建(提交)時間
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;
// 任務(wù)執(zhí)行總時間:任務(wù)結(jié)束執(zhí)行時間 - 任務(wù)開始執(zhí)行時間
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);
}

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2020-04-23 11:43:55

MySQL數(shù)據(jù)庫SQL

2017-08-30 17:21:05

LinuxShell超時現(xiàn)象

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進(jìn)程模型

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數(shù)據(jù)存儲

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

架構(gòu)java服務(wù)端開發(fā)

2020-12-09 08:21:47

編程Exchanger工具

2022-10-14 08:18:07

Guavaweb應(yīng)用

2010-11-08 15:21:17

SQL Server連
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲一区二区在线播放 | 亚洲国产成人在线观看 | 国产精品久久久久久久久婷婷 | 日韩一区二区三区在线视频 | 欧美一区二区三区免费在线观看 | av香蕉 | 国产成人高清 | 国产精品一区二区三区久久久 | 日韩在线视频免费观看 | 伊人免费观看视频 | 日韩成年人视频在线 | 在线视频91| 日韩成人中文字幕 | 国产成人a亚洲精品 | 中文字幕一区二区三区四区 | 日本 欧美 三级 高清 视频 | a级免费黄色片 | 免费在线观看h片 | 五月精品视频 | 北条麻妃一区二区三区在线观看 | 日韩a| 综合国产第二页 | 午夜精品一区二区三区三上悠亚 | 婷婷五月色综合香五月 | 国产传媒毛片精品视频第一次 | 日本在线黄色 | 国产情侣久久 | 日韩精品一区二区三区免费视频 | 午夜精品久久久久久久99黑人 | 国产欧美在线 | 欧美a在线 | 国产美女视频 | 日本亚洲欧美 | 羞羞视频网站免费观看 | 国产精品美女久久久久久久网站 | 麻豆精品国产91久久久久久 | 天天干天天操天天爽 | 99这里只有精品视频 | 97国产精品视频人人做人人爱 | 91精品国产91久久久久久三级 | 亚洲成人免费 |