java 多线程处理一个list的集合


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

/**
 * @ClassName ThreadUtils
 * @Description 
 * @Author qian
 * @Date 2019-07-10 16:31
 * @Version 1.0
 **/
public class ThreadUtils {

    public  static List<Object> dataMulThreadDispose(List<ClassEntity> classEntity , String hour){

        long startime =System.currentTimeMillis();

        int threaSize = 10000;
        int dataSize = classEntity.size();
        int threaNum = dataSize / threaSize + 1;
        boolean special = dataSize % threaSize ==0;
        //最后一个结果集:
        int lastDateSet =dataSize % threaSize;
        //添加参数 new ThreadPoolExecutor().
        //ExecutorService  exec = Executors.newFixedThreadPool(5);
        ExecutorService  exec =new  ThreadPoolExecutor(Runtime.getRuntime().availableProcessors()+1, Runtime.getRuntime().availableProcessors()+1, 30L, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(16),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());

        List<Callable<List<Object>>> tasks = new ArrayList<>();

        Callable<List<Object>>  task = null;

        List<ClassEntity> cutList = null;

        List<Object> resultMap = new ArrayList<>();

        for(int i =0; i<threaNum ; i++){
            if( i == threaNum - 1){
                if(special){
                    break;
                }
                cutList= classEntity.subList(threaSize * i, (threaSize * i)+lastDateSet);
            }else {
                cutList = classEntity.subList(threaSize * i ,threaSize * (i+1));
            }
            final List<ClassEntity> dataSets = cutList;
            final String condtionHour=hour;
            task =new Callable<List<Object>>() {
                @Override
                public List<Object> call() throws Exception {
                    List<Object> list=new ArrayList<>();
                    for(ClassEntity eUserExperienceDataScoreVo : dataSets){
                        //System.out.println(nowDay+"nowDay"+"datatime"+eUserExperienceDataScoreVo.getDateTime());

                        if(eUserExperienceDataScoreVo.getDateTime().contains(condtionHour)){
                            Object[] objects = new Object[3];
                            objects[0] = eUserExperienceDataScoreVo.getLat();
                            objects[1] = eUserExperienceDataScoreVo.getLng();
                            objects[2] = eUserExperienceDataScoreVo.getTotScore();
                            list.add(objects);
                            //list.remove(eUserExperienceDataScoreVo);//删除已经添加元素
                        }
                    }
                    return list;
                }
            };
            tasks.add(task);

        }

        try {
            List<Future<List<Object>>> results = exec.invokeAll(tasks);
            for (Future<List<Object>> result: results) {
                //System.out.println(result.get());
                resultMap.addAll(result.get());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        exec.shutdown();
        System.out.println("线程任务执行结束");
        System.err.println("执行任务消耗了 :" + (System.currentTimeMillis() - startime) + "毫秒");

        return resultMap;
    }
}
https://www.cnblogs.com/shihaiming/p/8553972.html

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
发出的红包

打赏作者

利剑 -~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值