构建高性能工作线程 3 工作线程

构建高性能工作线程 三 工作线程

工作线程

public abstract class WorkThread implements Runnable, Serializable{
    /** 线程池的参数是否改变 */
    private boolean isPoolSizeAliveTimeModf = false;
    /** JDK 线程池 spring封装 扩展实现的线程池 */
    private MyThreadPoolTaskExecutor taskExecutor;

    /** 核心线程数 */
    private static int corePoolSize;
    /** 最大线程数 */
    private static int maximumPoolSize;
    /** 线程池维护线程所允许的空闲时间 */
    private static int keepAliveTime;

    public WorkThread(TaskExecutor taskExecutor) {
      this.taskExecutor = (MyThreadPoolTaskExecutor) taskExecutor;
    }
    
    public final void run() {
        try {
             // 如果线程池参数有变化,则重置
          if (isPoolSizeAliveTimeModf()) {
                 taskExecutor.setCorePoolSize(corePoolSize);
                 taskExecutor.setMaxPoolSize(maximumPoolSize);
                 taskExecutor.setKeepAliveSeconds(keepAliveTime);
            }
            //抽象函数,供子类实现
            doTask();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    //任务工作
    public abstract void doTask() throws Exception;

   //获取缓冲队列QUEUE,用于维护监控
   public BlockingQueue getQueue() {
        return taskExecutor.getThreadPoolExecutor().getQueue();
   }

   //获取队列size,用于维护监控
   public int getQueueSize() {
      if (this.getQueue() instanceof LinkedBlockingQueue) {
         return this.getQueue().size();
      } else {
         return this.getQueue().size();
      }
   }
   //如果线程池中的参数有变化,自动调用update方法
   public void update(Observable observable, Object obj) {
       if (obj instanceof Map) {
           HashMap<String, Integer> poolMap = (HashMap<String, Integer>) obj;
           //打印 线程池  历史大小 和 要更改的大小
       corePoolSize = poolMap.get("corePoolSize");
           maximumPoolSize = poolMap.get("maximumPoolSize");
           keepAliveTime = poolMap.get("keepAliveTime");

           //一定要把值设到线程池中
       taskExecutor.setCorePoolSize(corePoolSize);
           taskExecutor.setMaxPoolSize(maximumPoolSize);
           taskExecutor.setKeepAliveSeconds(keepAliveTime);
       }
   }

   public MyThreadPoolTaskExecutor getTaskExecutor() {
      return taskExecutor;
   }
   public void setMaximumPoolSize(int maximumPoolSize) {
      this.maximumPoolSize = maximumPoolSize;
   }
   public boolean isPoolSizeAliveTimeModf() {
      return isPoolSizeAliveTimeModf;
   }
   public void setKeepAliveTime(int keepAliveTime) {
      this.keepAliveTime = keepAliveTime;
   }

}