自定义线程创建:ThreadFactory
线程池中的线程是从哪里来的呢?
ThreadPoolExecutor(int corePoolSize,//指定了线程池种的线程数量
int maximumPoolSize,//指定了线程池中的最大线程数量。
long keepAliveTime,// 当线程池数量超过了corePoolSize,多余的空闲线程的存活时间,即超过corePoolSize的空闲线程,在多长时间内会被销毁。
TimeUnit unit,//keepAliveTime的单位
BlockingQueue<Runnable> workQueue,//任务队列,被提交尚未被执行的任务。
ThreadFactory threadFactory,//线程工厂,用于创建线程,一般用默认的即可。
RejectedExecutionHandler handler)// 拒绝策略,当任务太多来不及处理,如何拒绝任务。
public class ExtThreadPool {
public static class MyTask implements Runnable{
public String name;
public MyTask(String name){
this.name = name;
}
@Override
public void run() {
System.out.println("正在执行" + ":Thread ID:" + Thread.currentThread().getId()
+ ",Task Name=" + name);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ExecutorService es = new ThreadPoolExecutor(5,5,0L,
TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()){
@Override
protected void beforeExecute(Thread t,Runnable r){
System.out.println("准备执行"+((MyTask) r).name);
}
@Override
protected void afterExecute(Runnable r,Throwable t){
System.out.println("执行完成"+((MyTask) r).name);
}
@Override
protected void terminated(){
System.out.println("线程退出");
}
};
for(int i=0;i<5;i++){
MyTask task = new MyTask("Task");
es.execute(task);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
es.shutdown();
}
}
比如:监控每个任务执行的开始时间和结束时间,或者其他一些自定义的增强功能,这时候该怎么办呢?
一个好消息是:ThreadPoolExecutor是一个可以扩展的线程池,它提供了
beforeExecute(),afterExecute()和terminated()三个接口来对线程池进行控制。
扩展原有线程池,实现了
beforeExecute,afterExecute,terminiate三个方法。
调用shutdown方法关闭线程池,这是一个比较安全的方法
如果当前正有线程在执行,shutdown方法
并不会立即暴力终止所有任务。
它会等待所有任务执行完成后,再关闭线程池。
当它并不会等待所有线程执行完成后再返回。
因此,可以简单地理解成shutdown方法只是发送了一个关闭
信号而已。但在shutdown方法后,这个线程池就不能再接收其他
新的任务了。