//多线程处理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集合
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一. oracle数据库编码格式 二. 集合中存放对象的id提取成List<String> 三. JAVA多线程中...
- 前言 在日常开发过程中,List是我们常用的集合,比如查询数据库内容返回值比会用一个集合来装,但是在多线程并发的条...