多线程执行工具方法

程序员与数学家 / 2023-08-30 / 原文

    public static <P, T> List<CompletableFuture<T>> multiThreadRun(Function<P, T> run, Collection<P> list, int threadSize, Executor executor, boolean waitRunFinal) {
        List<CompletableFuture<T>> cf = new ArrayList<>(threadSize);
        for (P obj : list) {
            cf.add(CompletableFuture.supplyAsync(() -> run.apply(obj), executor));
            if (waitRunFinal && cf.size() == threadSize) {
                cf.forEach(CompletableFuture::join);
                cf.clear();
            }
        }
        if(waitRunFinal) {
            cf.forEach(CompletableFuture::join);
        }
        return cf;
    }