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

发布时间:2023年12月22日

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

文章来源:https://blog.csdn.net/wcg_jishuo/article/details/135162696
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。