java 线程池实现


import java.util.*;
import java.util.concurrent.*;

public class TestThreadPoolService {

    //可用的cpu数量
    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    //阻塞队列大小
    private static final BlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingQueue<Runnable>(10*1000);
    // 根据系统配置设置合适的核心线程数、最大线程数、等待队列等参数。
    // 这个需要按照实际业务进行设置,需要考虑当前业务是IO密集和CPU密集
    private static final ExecutorService executor = new ThreadPoolExecutor(CPU_COUNT * 4 + 1, CPU_COUNT * 10 + 1, 1L, TimeUnit.MINUTES, WORK_QUEUE, Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.CallerRunsPolicy()
    );

    /**
     * 业务入口方法
     * @param orderIds
     * @throws InterruptedException
     * @throws ExecutionException
     */
    private void testThreadPool(List<String> orderIds) throws InterruptedException, ExecutionException {
        CompletionService<Map<String,Object>> completionService = new ExecutorCompletionService<>(executor);
        //单号id列表
        List<Future<Map<String,Object>>> futures = new ArrayList<>(orderIds.size());
        //循环添加任务
        for(final String orderId : orderIds){
            futures.add(completionService.submit(new Callable<Map<String,Object>>() {
                @Override
                public Map<String,Object> call(){
                    return targetMethod(orderId);
                }
            }));
        }
        //接受返回结果.这里需要注意返回的顺序可能会跟原始调用顺序不一致,需要通过map的key进行对应处理
        for(int i = 0; i < orderIds.size();i++){
            Map<String,Object> result = completionService.take().get();
            // TODO 拿到对应result后需要进行的业务逻辑
        }
    }

    /**
     * 需要执行的代码
     * @param orderId
     * @return
     */
    private Map<String,Object> targetMethod(String orderId) {
        Map<String,Object> map = new HashMap<>();
        Object result = null;
        // TODO 需要执行的业务
        map.put(orderId,result);
        return map;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值