手动定义线程池相关参数

1、线程的参数配置:

/**
 * 手动定义线程池参数,避免出现OOM
 * 采用的是无界队列(当任务数大于核心线程数,多余的任务在队列排队
 * 直到有空闲的线程才去处理)
 * @author xpzhang
 *
 */
public class CommonThreadPool {
	  // 核心线程池
	  private static final int CORE_POOL_SIZE = 10;
	  // 线程活跃时间
	  private static final int KEEP_ALIVE_TIME = 60;
	  
	  private static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(
	      CORE_POOL_SIZE,
	      Integer.MAX_VALUE,
	      KEEP_ALIVE_TIME, TimeUnit.SECONDS,
	      new LinkedBlockingDeque<>(),
	      new ThreadPoolExecutor.AbortPolicy());

	public static ThreadPoolExecutor getExecutor() {
		return EXECUTOR;
	}
	  
}

2、项目运用:

/**
     * 定时任务向第三方平台发送逾期事件
     * @param list
     */
    public void sendOverdueEvent(List<RefundView> list){

        ThreadPoolExecutor threadPoolExecutor = CommonThreadPool.getExecutor();
        for (RefundView vo : list) {
            //开启异步线程推送数据
            threadPoolExecutor.execute(()->{
                //只有符合平台条件才推送数据
                if(assetsPlatformService.checkProject(vo.getProductId(),PU_HUO_DAI)){
                    EventDTO assetsReq = new EventDTO();
                    assetsReq.setEventType(EventType.FINANCING_ORDER_FINANCING_OVERDUE);
                    assetsReq.setName(EventType.FINANCING_ORDER_FINANCING_OVERDUE.getValue());
                    assetsReq.setEventDate(LocalDateTimeUtils.getLocalDateTimeFromDate(vo.getOverdueDate()));
                    assetsReq.setSponsor(vo.getLoanee());
                    assetsReq.setResult("成功");
                    assetsReq.setOriginalId(vo.getWithdrawalCode());
                    assetsReq.setSource(AppConstants.ASSETS_LOAN_SOURCE);
                    try {
                        boolean reqStatus = assetsService.sendWithDrawlData(vo.getWithdrawalCode(), assetsReq);
                       if(reqStatus){//请求成功,调用第三方更新接口
                            FinancingOrderDTO financingOrderDTO = packageUpdateEvenData(vo);
                            assetsService.sendUpdateEventData(financingOrderDTO);
                        }
                    } catch (Exception e) {
                        log.error("向第三方平台推送逾期数据异常,推送编号:getWithdrawalCode:{}",vo.getWithdrawalCode());
                    }
                }
            });
        }

    }

3、基于spring的线程池,可携带参数

/**
 * 继承父线程http请求上下文
 * @author xpzhang
 *
 */
public class ContextThreadPool {
	 private static final int CORE_POOL_SIZE = 10;
	    private static final int MAX_POOL_SIZE = 20;
	    private static final int QUEUE_CAPACITY = 1024;
	    private static final int KEEP_ALIVE_TIME = 60;

	    private static final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

	    static {
	        executor.setCorePoolSize(CORE_POOL_SIZE);
	        executor.setMaxPoolSize(MAX_POOL_SIZE);
	        executor.setKeepAliveSeconds(KEEP_ALIVE_TIME);
	        executor.setQueueCapacity(QUEUE_CAPACITY);
	        executor.setThreadFactory(new DefaultThreadFactory("context-pool", false));
	        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
	        executor.setTaskDecorator(runnable -> {
	            try {
	                RequestAttributes attributes = RequestContextHolder.currentRequestAttributes();
	                return () -> {
	                    try {
	                        RequestContextHolder.setRequestAttributes(attributes);
	                        runnable.run();
	                    } finally {
	                        RequestContextHolder.resetRequestAttributes();
	                    }
	                };
	            } catch (IllegalStateException e) {
	                return runnable;
	            }
	        });
	        executor.initialize();
	    }

	    public static ThreadPoolTaskExecutor getExecutor() {
	        return executor;
	    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值