跳至主要內容

代码使用

yanhom代码使用dynamictp大约 3 分钟

线程池定义

建议直接配置在配置中心,但是如果想后期再添加到配置中心,可以先用 @Bean 编码式声明(方便 Spring 依赖注入)

@Configuration
public class ThreadPoolConfiguration {

  /**
   * 通过{@link DynamicTp} 注解定义普通juc线程池,会享受到该框架增强能力,注解名称优先级高于方法名
   *
   * @return 线程池实例
   */
  @DynamicTp("jucThreadPoolExecutor")
  @Bean
  public ThreadPoolExecutor jucThreadPoolExecutor() {
    return (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
  }

  /**
   * 通过{@link DynamicTp} 注解定义spring线程池,会享受到该框架增强能力,注解名称优先级高于方法名
   *
   * @return 线程池实例
   */
  @DynamicTp("threadPoolTaskExecutor")
  @Bean
  public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    return new ThreadPoolTaskExecutor();
  }

  /**
   * 通过{@link ThreadPoolCreator} 快速创建一些简单配置的线程池,使用默认参数
   * tips: 建议直接在配置中心配置就行,不用@Bean声明
   *
   * @return 线程池实例
   */
  @Bean
  public DtpExecutor dtpExecutor0() {
    return ThreadPoolCreator.createDynamicFast("dtpExecutor0");
  }

  /**
   * 通过{@link ThreadPoolBuilder} 设置详细参数创建动态线程池
   * tips: 建议直接在配置中心配置就行,不用@Bean声明
   * @return 线程池实例
   */
  @Bean
  public ThreadPoolExecutor dtpExecutor1() {
    return ThreadPoolBuilder.newBuilder()
            .threadPoolName("dtpExecutor1")
            .threadFactory("test-dtp-common")
            .corePoolSize(10)
            .maximumPoolSize(15)
            .keepAliveTime(40)
            .timeUnit(TimeUnit.SECONDS)
            .workQueue(MEMORY_SAFE_LINKED_BLOCKING_QUEUE.getName(), 2000)
            .buildDynamic();
  }

  /**
   * 通过{@link ThreadPoolBuilder} 设置详细参数创建动态线程池
   * eager,参考tomcat线程池设计,适用于处理io密集型任务场景,具体参数可以看代码注释
   * tips: 建议直接在配置中心配置就行,不用@Bean声明
   * @return 线程池实例
   */
  @Bean
  public DtpExecutor eagerDtpExecutor() {
    return ThreadPoolBuilder.newBuilder()
            .threadPoolName("eagerDtpExecutor")
            .threadFactory("test-eager")
            .corePoolSize(2)
            .maximumPoolSize(4)
            .queueCapacity(2000)
            .eager(true)
            .buildDynamic();
  }

  /**
   * 通过{@link ThreadPoolBuilder} 设置详细参数创建动态线程池
   * ordered,适用于处理有序任务场景,任务要实现Ordered接口,具体参数可以看代码注释
   * tips: 建议直接在配置中心配置就行,不用@Bean声明
   * @return 线程池实例
   */
  @Bean
  public OrderedDtpExecutor orderedDtpExecutor() {
    return ThreadPoolBuilder.newBuilder()
            .threadPoolName("orderedDtpExecutor")
            .threadFactory("test-ordered")
            .corePoolSize(4)
            .maximumPoolSize(4)
            .queueCapacity(2000)
            .buildOrdered();
  }

  /**
   * 通过{@link ThreadPoolBuilder} 设置详细参数创建线程池
   * scheduled,适用于处理定时任务场景,具体参数可以看代码注释
   * tips: 建议直接在配置中心配置就行,不用@Bean声明
   * @return 线程池实例
   */
  @Bean
  public ScheduledExecutorService scheduledDtpExecutor() {
    return ThreadPoolBuilder.newBuilder()
            .threadPoolName("scheduledDtpExecutor")
            .corePoolSize(2)
            .threadFactory("test-scheduled")
            .rejectedExecutionHandler(CALLER_RUNS_POLICY.getName())
            .buildScheduled();
  }
}

  /**
   * 通过{@link ThreadPoolBuilder} 设置详细参数创建线程池
   * priority,适用于处理优先级任务场景,具体参数可以看代码注释
   * tips: 建议直接在配置中心配置就行,不用@Bean声明
   *
   * @return 线程池实例
   */
  @Bean
  public PriorityDtpExecutor priorityDtpExecutor() {
    return ThreadPoolBuilder.newBuilder()
            .threadPoolName("priorityDtpExecutor")
            .corePoolSize(2)
            .maximumPoolSize(4)
            .threadFactory("test-priority")
            .rejectedExecutionHandler(CALLER_RUNS_POLICY.getName())
            .buildPriority();
  }

代码引用

从 DtpRegistry 中根据线程池名称获取,或者通过依赖注入方式(推荐,更优雅)

  • 依赖注入方式使用,优先推荐依赖注入方式,不能使用依赖注入的场景可以使用方式2

    @Resource
    private ThreadPoolExecutor dtpExecutor1;
    
    public void exec() {
       dtpExecutor1.execute(() -> System.out.println("test"));
    }
    
  • 从 DtpRegistry 注册器获取(接口场景可用)

    public static void main(String[] args) {
       DtpExecutor dtpExecutor = DtpRegistry.getDtpExecutor("dtpExecutor1");
       dtpExecutor.execute(() -> System.out.println("test"));
    }
    
  • 更详细使用实例请参考 example 工程

上次编辑于:
贡献者: kamtohung