并发线程工具类分享

hi,我是阿昌,今天分享一下并发线程工具类分享可以更好的在实际项目中进行使用,废话不多说,上来先分享java类

特点:

  1. 支持信号量控制并发数
  2. 支持自定义线程
  3. 简单易用
java 复制代码
@Slf4j
@Setter@Getter
public class ConcurrentExecutor<R> {


    public final ExecutorService executorService;

    /**
     * 信号量
     */
    private int permits;

    /**
     * 默认信号量大小
     */
    public static final int DEFAULT_PERMITS = 4;

    /**
     * 信号量实例
     */
    private final Semaphore semaphore;

    public static final int SEMAPHORE_TIMEOUT_MILL_SEC = 100;
    /**
     * 需要异步执行的任务
     */
    private List<R> syncExecuteResult = new ArrayList<>();

    private List<CompletableFuture<R>> futureList = new ArrayList<>();

    public ConcurrentExecutor(int permits, ExecutorService executorService) {
        this.permits = permits;
        this.semaphore = new Semaphore(permits);//并发数;控制
        this.executorService = executorService;
    }

    public static <R> ConcurrentExecutor<R> newConService(int permits, ExecutorService executorService) {
        return new ConcurrentExecutor<>(permits, executorService);
    }

    public static <R> ConcurrentExecutor<R> newConService(ExecutorService executorService) {
        return new ConcurrentExecutor<>(ConcurrentExecutor.DEFAULT_PERMITS, executorService);
    }

    /**
     * 提交单个任务
     */
    public ConcurrentExecutor<R> submit(Supplier<R> supplier) {
        boolean acquire;
        try {
            acquire = semaphore.tryAcquire(SEMAPHORE_TIMEOUT_MILL_SEC, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            acquire = false;
        }
        if (acquire) {
            CompletableFuture<R> future = CompletableFuture.supplyAsync(supplier, executorService);
            future.whenComplete((t, throwable) -> semaphore.release());
            futureList.add(future);
        } else {
            syncExecuteResult.add(supplier.get());
        }
        return this;
    }

    /**
     * 等待所有任务结束,无超时
     */
    public CompletableFuture<List<R>> invokeAllFuture() {
        return CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]))
                .thenApply(e -> futureList.stream()
                        .map(CompletableFuture::join)
                        .collect(Collectors.toList()))
                .whenComplete((rs, throwable) -> {
                    if (rs != null && syncExecuteResult != null && syncExecuteResult.size() > 0) {
                        rs.addAll(syncExecuteResult);
                    }
                });
    }

    public List<R> invokeAll() {
        return invokeAllFuture().join();
    }
}

这个工具类可以使用自定义线程池,并设置信号量各种来限制并发执行的线程数量,同时用invokeAllFuture()来让主线程阻塞,等待所有异步线程执行完毕后再执行;

使用案例:比如在多线程调用ai模型

java 复制代码
//多线程调用ai识别
ConcurrentExecutor<String> executor = new ConcurrentExecutor<>(3, ItemConstant.aiThreadPoolExecutor);
for (List<String> partList : Lists.partition(skuNameList, 5)) {
  executor.submit(() -> {
    String str = AiStrategyFactory.chatCompletions(partList);
    if (StrUtil.isNotBlank(str)) {
      System.out.println("ai调用执行结果:" + str);
    }
    return str;
  });
}
//阻塞主线程,直到所有任务完成
executor.invokeAll();
//获取到所有线程执行结果,进行结果处理
List<String> syncExecuteResult = executor.getSyncExecuteResult();
相关推荐
Joy T5 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
m0_587383008 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·9 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
代码不停10 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金12 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
paopaokaka_luck12 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
Wang's Blog13 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
Wang's Blog13 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网13 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff14 小时前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈