我的应用我做主:扩展线程池

文章讲述了如何在Java中使用ThreadPoolExecutor创建线程,以及如何通过扩展其提供的beforeExecute,afterExecute和terminated方法来实现任务监控和自定义功能。还提到shutdown方法的异步行为和线程池的关闭机制。

自定义线程创建: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方法后,这个线程池就不能再接收其他
新的任务了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值