import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
//扩展线程池以提供日志和计时功能
public class TimingThreadPool extends ThreadPoolExecutor{
//需要重写配置型的构造方法
public TimingThreadPool(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
public static void main(String[] args) {
//默认使用Executors.newCachedThreadPool()的配置方法,过期时间为60秒
TimingThreadPool pool = new TimingThreadPool(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
pool.runTask();
pool.shutdown();
}
//执行任务
public void runTask(){
this.execute(new Runnable(){
@Override
public void run() {
System.out.println("我执行了一个任务~");
}}
);
}
//执行任务之前
@Override
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
System.out.println("执行任务之前~");
}
//执行任务之后
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
System.out.println("执行任务之后~");
}
//执行任务完成,需要执行关闭操作才会调用这个方法
@Override
protected void terminated() {
super.terminated();
System.out.println("执行任务完成~");
}
/**
* 运行结果:
* 执行任务之前~
我执行了一个任务~
执行任务之后~
执行任务完成~
*/
}
上面的是一个程序的简单描述,下面的程序会有实际意义点
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
public class LogThreadPool extends ThreadPoolExecutor{
public LogThreadPool(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
private final AtomicInteger numTasks = new AtomicInteger();//线程个数
private final AtomicLong totalTimes = new AtomicLong();//所有线程总执行时间
private ThreadLocal<Long> startTime = new ThreadLocal<Long>();
public static void main(String[] args) {
ThreadPoolExecutor pool = new LogThreadPool(0, Integer.MAX_VALUE, 60,
TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
Runnable task = new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"任务正在执行");
try {
int rand = new Random().nextInt(1000);
Thread.sleep(rand);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
int ThreadNum = 5;
for(int i=0; i<ThreadNum; i++){
pool.execute(task);
}
pool.shutdown();
}
//在执行给定线程中的给定 Runnable 之前调用的方法
@Override
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
System.out.println(Thread.currentThread().getName()+"任务执行之前..");
startTime.set(System.currentTimeMillis());
}
//基于完成执行给定 Runnable 所调用的方法
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
long endTime = System.currentTimeMillis();
long tasktime = endTime - startTime.get();
numTasks.incrementAndGet();
System.out.println(Thread.currentThread().getName()+"任务执行之后运行毫秒数:"+tasktime);
totalTimes.addAndGet(tasktime);
}
//当 Executor 已经终止时调用的方法
@Override
protected void terminated() {
super.terminated();
System.out.println("任务全部完成.......");
System.out.println("共有几个线程执行:"+numTasks);
System.out.println("共运行了几毫秒:"+totalTimes.get());
}
/**
* 运行结果:
* pool-1-thread-1任务执行之前..
pool-1-thread-1任务正在执行
pool-1-thread-2任务执行之前..
pool-1-thread-2任务正在执行
pool-1-thread-4任务执行之前..
pool-1-thread-4任务正在执行
pool-1-thread-3任务执行之前..
pool-1-thread-3任务正在执行
pool-1-thread-5任务执行之前..
pool-1-thread-5任务正在执行
pool-1-thread-1任务执行之后运行毫秒数:47
pool-1-thread-3任务执行之后运行毫秒数:407
pool-1-thread-4任务执行之后运行毫秒数:469
pool-1-thread-2任务执行之后运行毫秒数:500
pool-1-thread-5任务执行之后运行毫秒数:703
任务全部完成.......
共有几个线程执行:5
共运行了几毫秒:2126
*/
}