详解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;i length?length:end); thread.start(); } } classHandleThreadextendsThread{ privateStringthreadName; privateList data; privateintstart; privateintend; publicHandleThread(StringthreadName,List data,intstart,intend){ this.threadName=threadName; this.data=data; this.start=start; this.end=end; } publicvoidrun(){ List subList=data.subList(start,end)/*.add("^&*")*/; System.out.println(threadName+"处理了"+subList.size()+"条!"); } } publicstaticvoidmain(String[]args){ Test_4test=newTest_4(); //准备数据 List data=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 (); Map map=newHashMap (); for(inti=0;i<1000;i++){ list.add(""+i); } intpcount=Runtime.getRuntime().availableProcessors(); longstart=System.currentTimeMillis(); for(inti=0;i list; privateMap map; publicMyThread1(List list,Map map){ 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 >(); Callable task=null; List cutList=null; //确定每条线程的数据 for(inti=0;i listStr=cutList; task=newCallable (){ @Override publicIntegercall()throwsException{ System.out.println(Thread.currentThread().getName()+"线程:"+listStr); return1; } }; //这里提交的任务容器列表和返回的Future列表存在顺序对应的关系 tasks.add(task); } List >results=exec.invokeAll(tasks); for(Future future:results){ System.out.println(future.get()); } //关闭线程池 exec.shutdown(); System.out.println("线程任务执行结束"); System.err.println("执行任务消耗了:"+(System.currentTimeMillis()-start)+"毫秒"); } 以上所述是小编给大家介绍的Java多线程处理List数据详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。