确定,但是每个线程池处理的数据量应该大致相同。

可以使用以下代码实现:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class ThreadPoolExample {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建一个包含100个元素的List
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            list.add(i);
        }

        // 创建5个线程池,每个线程池处理大约20个元素
        int poolSize = 5;
        int chunkSize = (int) Math.ceil((double) list.size() / poolSize);
        ExecutorService executorService = Executors.newFixedThreadPool(poolSize);
        List<Future<List<Integer>>> futures = new ArrayList<>();
        for (int i = 0; i < list.size(); i += chunkSize) {
            int fromIndex = i;
            int toIndex = Math.min(i + chunkSize, list.size());
            List<Integer> sublist = list.subList(fromIndex, toIndex);
            Callable<List<Integer>> task = () -> {
                // 模拟处理数据
                Thread.sleep(1000);
                return sublist;
            };
            Future<List<Integer>> future = executorService.submit(task);
            futures.add(future);
        }

        // 等待所有任务完成并合并结果
        List<Integer> result = new ArrayList<>();
        for (Future<List<Integer>> future : futures) {
            result.addAll(future.get());
        }

        // 输出结果
        System.out.println(result);
        executorService.shutdown();
    }
}

解释一下代码:

  1. 首先创建一个包含100个元素的List;
  2. 然后确定要创建5个线程池,每个线程池处理大约20个元素。为了实现这个目标,可以使用 Math.ceil((double) list.size() / poolSize) 计算出每个线程池要处理的元素数量,并使用 List.subList(fromIndex, toIndex) 方法将原始列表划分成多个子列表;
  3. 接着,创建一个 ExecutorService,使用 ExecutorService.submit(Callable) 方法提交每个子任务。每个子任务都是一个 Callable,它的返回值是一个包含一部分元素的列表。这里使用 Future 来获取每个子任务的结果;
  4. 最后,使用 Future.get() 方法等待所有任务完成并合并结果,输出最终的结果。

需要注意的是,在实际应用中,线程池的大小和每个子任务的大小都需要根据具体情况来选择。如果线程池太大,会浪费系统资源;如果线程池太小,会导致任务排队等待,降低系统吞吐量。同样地,如果每个子任务的大小太小,会导致线程切换的开销大,降低系统吞吐量;如果每个子任务的大小太大,会导致某些线程忙碌过久,影响系统的稳定性。因此,在实际应用中需要根据具体情况进行调整。

java ThreadPoolExecutor 创建5个线程池每个线程池平均分配list里面的数据list大小不一定

原文地址: http://www.cveoy.top/t/topic/bVT2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录