详解Java多线程处理List数据
实例1:
解决问题:如何让n个线程顺序遍历含有n个元素的List集合
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.commons.lang3.ArrayUtils;
publicclassTest_4{
/**
*多线程处理list
*
*@paramdata数据list
*@paramthreadNum线程数
*/
publicsynchronizedvoidhandleList(Listdata,intthreadNum){
intlength=data.size();
inttl=length%threadNum==0?length/threadNum:(length
/threadNum+1);
for(inti=0;ilength?length:end);
thread.start();
}
}
classHandleThreadextendsThread{
privateStringthreadName;
privateListdata;
privateintstart;
privateintend;
publicHandleThread(StringthreadName,Listdata,intstart,intend){
this.threadName=threadName;
this.data=data;
this.start=start;
this.end=end;
}
publicvoidrun(){
ListsubList=data.subList(start,end)/*.add("^&*")*/;
System.out.println(threadName+"处理了"+subList.size()+"条!");
}
}
publicstaticvoidmain(String[]args){
Test_4test=newTest_4();
//准备数据
Listdata=newArrayList();
for(inti=0;i<6666;i++){
data.add("item"+i);
}
test.handleList(data,5);
System.out.println(ArrayUtils.toString(data));
}
}
实例2:
List多线程并发读取读取现有的list对象
//测试读取List的线程类,大概34秒
packagecom.thread.list;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
publicclassMain{
publicstaticvoidmain(String[]args){
Listlist=newArrayList();
Mapmap=newHashMap();
for(inti=0;i<1000;i++){
list.add(""+i);
}
intpcount=Runtime.getRuntime().availableProcessors();
longstart=System.currentTimeMillis();
for(inti=0;ilist;
privateMapmap;
publicMyThread1(Listlist,Mapmap){
this.list=list;
this.map=map;
}
@Override
publicvoidrun(){
intpcount=Runtime.getRuntime().availableProcessors();
inti=map.get(Thread.currentThread().getId());
for(;i
实例3:
多线程分段处理List集合
场景:大数据List集合,需要对List集合中的数据同标准库中数据进行对比,生成新增,更新,取消数据
解决方案:
- List集合分段,
- 动态创建线程池newFixedThreadPool
- 将对比操作在多线程中实现
publicstaticvoidmain(String[]args)throwsException{
//开始时间
longstart=System.currentTimeMillis();
Listlist=newArrayList();
for(inti=1;i<=3000;i++){
list.add(i+"");
}
//每500条数据开启一条线程
intthreadSize=500;
//总数据条数
intdataSize=list.size();
//线程数
intthreadNum=dataSize/threadSize+1;
//定义标记,过滤threadNum为整数
booleanspecial=dataSize%threadSize==0;
//创建一个线程池
ExecutorServiceexec=Executors.newFixedThreadPool(threadNum);
//定义一个任务集合
List>tasks=newArrayList>();
Callabletask=null;
ListcutList=null;
//确定每条线程的数据
for(inti=0;ilistStr=cutList;
task=newCallable(){
@Override
publicIntegercall()throwsException{
System.out.println(Thread.currentThread().getName()+"线程:"+listStr);
return1;
}
};
//这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
tasks.add(task);
}
List>results=exec.invokeAll(tasks);
for(Futurefuture:results){
System.out.println(future.get());
}
//关闭线程池
exec.shutdown();
System.out.println("线程任务执行结束");
System.err.println("执行任务消耗了:"+(System.currentTimeMillis()-start)+"毫秒");
}
以上所述是小编给大家介绍的Java多线程处理List数据详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。