监控ThreadPoolExecutor具体Task在Queue中等待时间

本文介绍了一种可监控的线程池实现方案,通过继承`ThreadPoolExecutor`并增加监控逻辑来跟踪线程池的状态,包括任务等待时间、执行时间等关键指标,并实现了动态调整线程池配置的功能。

可监控_ThreadPoolExecutor

  • 主要关心的问题:

    * 最关心的监控数据:
    * 1.task队列中等待时间
    * 2.task任务执行时间
    *
    *  两种方案:
    * 1. future_task
    * 2. queue
    * 注意:Config-自动获取配置文件注解(后面有时间写)
    
  • 处理:

    • 继承,初始化构造方法

      private static MonitoringLinkedBlockingQueue monitoringQueue = new MonitoringLinkedBlockingQueue(maxQueueSize);
      
      public MonitoringThreadPoolExecutor() {
          super(CPU_PROCESSOR_NUM << 1, CPU_PROCESSOR_NUM << 2, 50, TimeUnit.SECONDS,
                  monitoringQueue,
                  new NamedThreadFactory(THREAD_FACTORY_NAME, false), new RejectedExecutionHandler() {
                      @Override
                      public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                          Monitor.recordOne("monitoring_thread_poll_task_reject");
                      }
                  });
          //设置为true,corePoolSize_alivetime后自动销毁
          allowCoreThreadTimeOut(true);
      }
    • init-基本监控定时获取

      @PostConstruct
      private void init() {
      //添加常用监控
      final ScheduledExecutorService coreMonitorService = Executors.newScheduledThreadPool(1);
      coreMonitorService.scheduleAtFixedRate(new Runnable() {
          @Override
          public void run() {
              Monitor.recordSize(THREAD_FACTORY_NAME + "_active_thread_count", getActiveCount());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_pool_size", getPoolSize());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_queue_size", getQueue().size());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_largest_pool_size", getLargestPoolSize());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_task_count", getTaskCount());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_completed_task_count", getCompletedTaskCount());
          }
      }, 1L, 2L, TimeUnit.SECONDS);
      
      Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
          @Override
          public void run() {
              shutdown();
              coreMonitorService.shutdown();
          }
      }));
      }
    • 重写submit

      @Override
      public MonitoringFutureTask<?> submit(Runnable task){
      if (task == null) {
          throw new NullPointerException();
      }
      if (task instanceof NamedRunnable) {
          MonitoringFutureTask<?> monitoringFutureTask = new MonitoringFutureTask<>(task, null);
          execute(monitoringFutureTask);
          return monitoringFutureTask;
      }else {
          throw new ForbiddenException("请使用NamedRunnable!");
      }
      }
    • 动态修改线程池核心配置

      @Config("can_monitor_thread_pool_executor.properties")
      private void changeProperties(Map<String, String> config) {
      logger.info("can_monitor_thread_pool_executor:{}", config);
      if (config != null) {
          int coreSize = IntegerUtil.parseStrToInt(config.get("coreSize"));
          if (coreSize > 0) {
              setCorePoolSize(coreSize);
          }
          int maxSize = IntegerUtil.parseStrToInt(config.get("maxSize"));
          if (maxSize > 0) {
              setMaximumPoolSize(maxSize);
          }
          int queueSize = IntegerUtil.parseStrToInt(config.get("queueSize"));
          if (queueSize > 0) {
              monitoringQueue.setMaxQueueSize(queueSize);
          }
          int keepAliveTime = IntegerUtil.parseStrToInt(config.get("keepAliveTime"));
          if (keepAliveTime > 0) {
              String timeUnitStr = config.get("timeUnit");
              if (timeUnitStr != null) {
                  TimeUnit timeUnit;
                  try {
                      timeUnit = TimeUnit.valueOf(timeUnitStr);
                      setKeepAliveTime(keepAliveTime, timeUnit);
                  } catch (IllegalArgumentException e) {
                      Monitor.recordOne("timeUnit_config_error");
                      setKeepAliveTime(keepAliveTime, TimeUnit.SECONDS);
                  }
              } else {
                  setKeepAliveTime(keepAliveTime, TimeUnit.SECONDS);
              }
          }
      }
      }
    • -
方案:多任务处理系统 ## 概述 这个程序方案旨在创建一个高效的多任务处理系统,能够同时处理多个任务并优化资源分配。 ## 核心功能 1. **任务队列管理** - 优先级队列实现 - 任务分类与标签系统 - 动态任务调度 2. **资源分配模块** - 自动负载均衡 - 资源监控与预警 - 智能资源分配算法 3. **并行处理引擎** - 多线程/多进程支持 - 异步I/O处理 - 任务依赖关系解析 ## 技术实现 ```python import concurrent.futures import queue import threading class MultiTaskSystem: def __init__(self, max_workers=4): self.task_queue = queue.PriorityQueue() self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) self.resource_monitor = ResourceMonitor() def add_task(self, task, priority=1): """添加任务到队列""" self.task_queue.put((priority, task)) def start_processing(self): """启动任务处理""" while not self.task_queue.empty(): priority, task = self.task_queue.get() if self.resource_monitor.can_allocate(task): self.executor.submit(task.execute) class ResourceMonitor: """资源监控类""" def __init__(self): self.available_resources = {...} def can_allocate(self, task): """检查是否有足够资源执行任务""" return all(self.available_resources[k] >= v for k, v in task.resource_requirements.items()) ``` ## 扩展功能 1. **任务可视化面板** - 实时显示任务状态 - 资源使用图表 - 历史数据分析 2. **智能预测系统** - 任务完成时间预测 - 资源需求预测 - 异常任务检测 3. **API接口** - RESTful API 集成 - WebSocket 实时更新 - 第三方服务对接 ## 部署方案 1. **容器化部署** - Docker 镜像打包 - Kubernetes 集群支持 - 自动扩缩容配置 2. **监控与日志** - Prometheus 指标收集 - ELK 日志系统 - 告警通知集成
最新发布
08-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值