多线程处理文件集合,先拆分,在执行

try {
                    File file = new File(path);
                    File[] files = file.listFiles();
                    log.info("当前共有文件 "+files.length+"个");

                    List<File> filesList = new ArrayList<>(Arrays.asList(files));
                    List<List<File>> dividedLists = SplitListUtils.splitList(filesList, 10);
                    int numThreads = Math.min(10, dividedLists.size());  // 获取实际的任务数量
                    log.info("线程数:"+ numThreads);
                    // 创建线程池并执行任务
                    ExecutorService executor = Executors.newFixedThreadPool(numThreads);
                    for (List<File> subFiles : dividedLists) {
                        executor.execute(() -> processFiles(subFiles));
                    }
                    executor.shutdown();
                    boolean finished = false;
                    try {
                        finished = executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                    } catch (InterruptedException e) {
                        // 处理中断异常
                        e.printStackTrace();
                    }

// 在执行完所有任务后继续后面的操作处理 collect_task 结束
                    if (finished) {
                        // 所有任务已完成,可以执行后续操作
                        System.out.println("ok.....");
                    } else {
                        // 等待超时或者被中断,可以根据需要进行处理
                        System.out.println("执行中....");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
 public static  List<List<File>> splitList(List<File> list, int numLists) {
        List<List<File>> dividedLists = new ArrayList<>();
        int size = list.size();
        int average = size / numLists;
        int remainder = size % numLists;
        int index = 0;

        for (int i = 0; i < numLists; i++) {
            int sublistSize = average + (i < remainder ? 1 : 0);
            List<File> sublist = new ArrayList<>(list.subList(index, index + sublistSize));
            if(sublist.size() > 0){
                dividedLists.add(sublist);
            }

            index += sublistSize;
        }

        return dividedLists;
    }

上面代码的拆分, 最多集合是10个,如果大集合的总数小于10,那就是大集合的数量。要是大集合的数量大于10个,那就均分到10个小集合中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的多线处理List集合通常用于提高程序的并发性能和资源利用率。多线程可以同时执行多个任务,而List集合提供了有序的数据结构,适合在并发环境中进行读写操作。以下是使用多线处理List的一些关键点: 1. **线程安全**:对于List集合,如果要在多线程环境下直接修改(如添加、删除元素),应使用`Collections.synchronizedList(list)`确保线程安全,这样每次修改都会自动同步。 2. **CopyOnWriteArrayList**:`CopyOnWriteArrayList`是一个线程安全的列表实现,当线程试图修改时,会创建一个新的列表副本进行修改,避免了同步带来的性能开销,但不适合频繁的随机访问。 3. **并发包的工具类**:`java.util.concurrent`包中提供了`ConcurrentHashMap`和`BlockingQueue`等线程安全的数据结构,这些可以用来配合多线程操作List,例如用`BlockingQueue`作为缓冲区,处理线程间的数据交换。 4. **线程池**:使用`ExecutorService`或`ThreadPoolExecutor`创建线程池可以更好地管理并发任务,确保资源的有效利用,并可以通过设置线程池大小控制并发程度。 5. **线程同步**:如果需要多个线程同时读取但只修改一个线程的List,可以使用`synchronized`关键字对特定范围内的代码块进行同步,防止数据冲突。 6. **原子操作**:`AtomicInteger`, `AtomicLong`等原子类可以在多线程环境中保证操作的原子性,对于List的索引更新等场景很有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值