@Override
protected void beforeExecute(Thread t, Runnable r) {
System.out.println("准备执行任务: " + r.toString());
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
System.out.println("结束任务: " + r.toString());
}
@Override
protected void terminated() {
System.out.println("线程池退出");
}
};
可以在回调接口中, 对线程池的状态进行监控, 例如任务执行的最长时间, 平均时间, 最短时间等等, 还有一些其他的属性如下:
taskCount:线程池需要执行的任务数量.
completedTaskCount:线程池在运行过程中已完成的任务数量.小于或等于taskCount.
largestPoolSize:线程池曾经创建过的最大线程数量.通过这个数据可以知道线程池是否满过.如等于线程池的最大大小,则表示线程池曾经满了.
getPoolSize:线程池的线程数量.如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不减.
getActiveCount:获取活动的线程数.
自定义拒绝策略
线程池满负荷运转后, 因为时间空间的问题, 可能需要拒绝掉部分任务的执行.
jdk提供了RejectedExecutionHandler接口, 并内置了几种线程拒绝策略
AbortPolicy: 直接拒绝策略, 抛出异常.
CallerRunsPolicy: 调用者自己执行任务策略.
DiscardOldestPolicy: 舍弃最老的未执行任务策略.
使用方式也很简单, 直接传参给ThreadPool
ExecutorService service = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS,
new SynchronousQueue<Runnable>(),
Executors.defaultThreadFactory(),
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("reject task: " + r.toString());
}
});
自定义ThreadFactory
线程工厂用于创建池里的线程. 例如在工厂中都给线程setDaemon(true), 这样程序退出的时候, 线程自动退出.
或者统一指定线程优先级, 设置名称等等.