zoukankan      html  css  js  c++  java
  • ThreadPoolExecutor线程池监控

    @Configuration
    @EnableAsync
    @Slf4j
    public class ThreadPoolConfig {
    
        @Value("${sys.thread.maxPoolSize:500}")
        private int maxPoolSize;
    
        @Bean
        public ThreadPoolExecutor executorService() {
            log.info("### The thread maxPoolSize is {}", maxPoolSize);
            return new ThreadPoolExecutorMdcWrapper(8, maxPoolSize,
                    60L, TimeUnit.SECONDS,
                    new SynchronousQueue<Runnable>());
        }
    
    }
    

      

    /**
     * 线程池MDC包装器
     */
    public class ThreadPoolExecutorMdcWrapper extends ThreadPoolExecutor {
    
        public ThreadPoolExecutorMdcWrapper(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
            super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
        }
    
        public ThreadPoolExecutorMdcWrapper(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
            super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
        }
    
        public ThreadPoolExecutorMdcWrapper(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
            super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
        }
    
        public ThreadPoolExecutorMdcWrapper(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
            super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
        }
    
        @Override
        public void execute(Runnable command) {
            super.execute(ThreadMdcUtil.wrap(command, MDC.getCopyOfContextMap()));
        }
    
        @Override
        public Future<?> submit(Runnable task) {
            return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));
        }
    
        @Override
        public <T> Future<T> submit(Runnable task, T result) {
            return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()), result);
        }
    
        @Override
        public <T> Future<T> submit(Callable<T> task) {
            return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));
        }
    }
    

      

    public class ThreadMdcUtil {
    
        public static void setTraceIdIfAbsent() {
            if (MDC.get(SocketConstants.TRACE_ID) != null) {
                return;
            }
            MDC.put(SocketConstants.TRACE_ID, TraceIdUtil.getTraceId());
        }
    
        public static <T> Callable<T> wrap(final Callable<T> callable, final Map<String, String> context) {
            return () -> {
                if (null == context) {
                    MDC.clear();
                } else {
                    MDC.setContextMap(context);
                }
                setTraceIdIfAbsent();
                try {
                    return callable.call();
                } finally {
                    MDC.clear();
                }
            };
        }
    
    
        public static Runnable wrap(final Runnable runnable, final Map<String, String> context) {
            return () -> {
                if (context == null) {
                    MDC.clear();
                } else {
                    MDC.setContextMap(context);
                }
                setTraceIdIfAbsent();
                try {
                    runnable.run();
                } finally {
                    MDC.clear();
                }
            };
        }
    
    }
    

      

    public class TraceIdUtil {
    
        public static String getTraceId() {
            return UUIDUtil.getUUID();
        }
    }
    

      

    public class UUIDUtil {
    
        public static String getUUID() {
            return UUID.randomUUID().toString().replace("-", "");
        }
    
    }
    

      

        @Autowired
        private ThreadPoolExecutor threadPoolExecutor;
    
        threadPoolExecutor.execute(()->{
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        log.error("",e);
                    }
                });
    
    ThreadVO threadVO = ThreadVO.builder()
                    //正在执行的线程
                    .activeCount(threadPoolExecutor.getActiveCount())
                    //设置的最小线程
                    .corePoolSize(threadPoolExecutor.getCorePoolSize())
                    //曾经最大的线程数
                    .largestPoolSize(threadPoolExecutor.getLargestPoolSize())
                    //设置的最大线程
                    .maximumPoolSize(threadPoolExecutor.getMaximumPoolSize())
                    //当前线程数
                    .poolSize(threadPoolExecutor.getPoolSize())
                    //已完成执行的任务的总数
                    .completedTaskCount(threadPoolExecutor.getCompletedTaskCount())
                    //线程保持活动时间
                    .keepAliveTime(threadPoolExecutor.getKeepAliveTime(TimeUnit.SECONDS))
                    //计划执行的任务总数
                    .taskCount(threadPoolExecutor.getTaskCount())
                    .build();
    
    @Getter
        @Setter(AccessLevel.PRIVATE)
        @ToString
        @Builder
        public static class ThreadVO{
            /**
             * 正在执行的线程
             */
            private Integer activeCount;
            /**
             *设置的最小线程
             */
            private Integer corePoolSize;
            /**
             *曾经最大的线程数
             */
            private Integer largestPoolSize;
            /**
             *设置的最大线程
             */
            private Integer maximumPoolSize;
            /**
             *当前线程数
             */
            private Integer poolSize;
            /**
             *已完成执行的任务的总数
             */
            private Long completedTaskCount;
            /**
             *线程保持活动时间
             */
            private Long keepAliveTime;
            /**
             *计划执行的任务总数
             */
            private Long taskCount;
        }
    

      

  • 相关阅读:
    OC中类的初始化
    iOS UITabBar简单使用
    iOS UIScrollView初体验
    iOS第一个Demo
    Xcode编写第一个iOS Demo(OC)及遇到的坑记录
    OC协议
    诚实的力量。Paul Graham (Y Combinator 创始人)关于诚实的评论。
    php5.4window下连接mssql
    mysql 游标嵌套循环实例
    关于支付宝接口文档的链接
  • 原文地址:https://www.cnblogs.com/alisande/p/14232238.html
Copyright © 2011-2022 走看看