//多线程处理list集合
public static void main(String[] args) {
//需要处理的list集合,list集合中常用的pojo对象,Map<String,Object>等,根据业务调整
List<String> allList = new ArrayList<>();
//模拟测试数据,添加3000条记录
for (int i = 1; i <=3000; i++) {
allList.add(i + "");
}
//这里我们用Callable创建线程,可以获取返回值。--定义接收返回的数据的集合
List<String> fanList =new ArrayList<>();
//每500条数据开启一个线程
int threadSize =500;
//总数据条数
int dataSize = allList.size();
//线程数
int threadNum=0;
if (dataSize%threadSize==0){
//能整除的话
threadNum=dataSize/threadSize;
}else {
//不能整除的话,多加一条处理多余的数据
threadNum=dataSize/threadSize+1;
}
//创建线程池,--拥有固定线程数量的线程池(推荐)
ExecutorService exc = Executors.newFixedThreadPool(threadNum);
//定义可以提交给线程池的任务集合
List<Callable<List<String>>> tasks = new ArrayList<>();
//每个线程的任务
Callable<List<String>> task = null;
//定义切割总List集合后的集合
List<String> cutList = null;
//遍历任务
for (int i = 0; i < threadNum; i++) {
//切割list
if (i==threadNum-1){
cutList=allList.subList(i*threadSize,allList.size());
}else {
cutList=allList.subList(i*threadSize,(i+1)*threadSize);
}
final List<String> finalCutList = cutList;
task = new Callable<List<String>>() {
@Override
public List<String> call() throws Exception {
//定义接收业务返回值的集合
List<String> newList = new ArrayList<>();
//处理自己的业务,这里挑选基数
for (String a :finalCutList){
if (Integer.parseInt(a)%2!=0){
//挑选出符合的条件
newList.add(Thread.currentThread().getName()+"-------"+a);
}
}
return newList;
}
};
//添加任务
tasks.add(task);
}
try {
//执行所有任务并获取结果,捕获异常InterruptedException
List<Future<List<String>>> results = exc.invokeAll(tasks);
for (Future<List<String>> result : results){
//调用get方法获取每个返回的结果,将结果添加到定义好的集合中。捕获异常ExecutionException
fanList.addAll( result.get());
}
}catch (InterruptedException | ExecutionException e){
e.printStackTrace();
}
//关闭线程池
exc.shutdown();
//处理返回的结果
for (String a : fanList){
System.out.println(a);
}
}
多线程处理list集合
最新推荐文章于 2024-05-13 01:53:41 发布