有時(shí)需要對(duì)線程池進(jìn)行擴(kuò)展,如在監(jiān)控每個(gè)任務(wù)的開(kāi)始和結(jié)束時(shí)間,或者自定義一些其他增強(qiáng)的功能。
ThreadPoolExecutor線程池提供了兩個(gè)方法:
● protected void afterExecute(Runnable r, Throwable t)
● protected void beforeExecute(Thread t, Runnable r)
在線程池執(zhí)行某個(gè)任務(wù)前會(huì)調(diào)用beforeExecute()方法,在任務(wù)結(jié)束后(任務(wù)異常退出)會(huì)執(zhí)行afterExecute()方法。
查看ThreadPoolExecutor源碼,在該類中定義了一個(gè)內(nèi)部類Worker, ThreadPoolExecutor線程池中的工作線程就是Worker類的實(shí)例, Worker實(shí)例在執(zhí)行時(shí)會(huì)調(diào)用beforeExecute()與 afterExecute()方法。
package com.wkcto.threadpool;
import com.wkcto.produerstack.MyStack;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 擴(kuò)展線程池
*/
public class Test06 {
//定義任務(wù)類
private static class MyTask implements Runnable{
String name;
public MyTask(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name + "任務(wù)正在被線程 " + Thread.currentThread().getId() + " 執(zhí)行");
try {
Thread.sleep(1000); //模擬任務(wù)執(zhí)行時(shí)長(zhǎng)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//定義擴(kuò)展線程池, 可以定義線程池類繼承ThreadPoolExecutor,在子類中重寫beforeExecute()/afterExecute()方法
//也可以直接使用ThreadPoolExecutor的內(nèi)部類
ExecutorService executorService = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>() ){
//在內(nèi)部類中重寫任務(wù)開(kāi)始方法
@Override
protected void beforeExecute(Thread t, Runnable r) {
System.out.println(t.getId() + "線程準(zhǔn)備執(zhí)行任務(wù): " + ((MyTask)r).name);
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
System.out.println( ((MyTask)r).name + "任務(wù)執(zhí)行完畢");
}
@Override
protected void terminated() {
System.out.println("線程池退出");
}
};
//向線程池中添加任務(wù)
for (int i = 0; i < 5; i++) {
MyTask task = new MyTask("task-" + i);
executorService.execute(task);
}
//關(guān)閉線程池
executorService.shutdown(); //關(guān)閉線程池僅僅是說(shuō)線程池不再接收新的任務(wù) , 線程池中已接收的任務(wù)正常執(zhí)行完畢
}
}