前言碎语
最近可能要批量处理一些数据,准备使用多线程来助力,回顾了下多线程的一些开发技巧,下面是多线程并行处理List的一个小例子
代码看关键
/** * @author kl by 2016/6/25 * @boke www.kailing.pub */ public class MutilThreadTask { public static void main(String[] args) { List<Object> list = new ArrayList(); for (int i = 0; i < 8014; i++) { list.add(i + "test.png"); } new MutilThreadTask().handleListMutiSchedule(list,5); } //多线程并行处理list数据集 public void handleListMutiSchedule(List list,int taskCount){ System.out.println("begin===================================="); ScheduledExecutorService executorService= Executors.newScheduledThreadPool(taskCount); int start = 0; int listSize=list.size(); int remainder=listSize%taskCount; int taskDataSize = listSize/taskCount; //平均分配task任务 for(int i=0;i<taskCount;i++,start+=taskDataSize){ int end = start + taskDataSize; //最后如果有分配不均的,多余部分交给最后一个任务处理 if(i==taskCount-1){ if(remainder!=0){ end=listSize; } } executorService.schedule(new Task(list,start,end),0,TimeUnit.SECONDS); } } //多线程并行处理list数据集 public void handleListMutiThread(List list,int taskCount){ int start = 0; ExecutorService ex = Executors.newFixedThreadPool(taskCount); int listSize=list.size(); int remainder=listSize%taskCount; int taskDataSize = listSize/taskCount; List<Future> futures = new ArrayList(taskCount); //平均分配task任务 for(int i=0;i<taskCount;i++,start+=taskDataSize){ int end = start + taskDataSize; //最后如果有分配不均的,多余部分交给最后一个任务处理 if(i==taskCount-1){ if(remainder!=0){ end=listSize; } } Future future=ex.submit(new Task(list,start,end)) ; futures.add(future); } try { //处理 for(Future future : futures){ Object listsf= future.get(); } System.exit(0); } catch (Exception e) { e.printStackTrace(); } } /** * Task任务执行单元 */ private class Task implements Callable<List<Object>> { private List<Object> list; private int start; private int end; public Task(List<Object> list,int start,int end){ this.list = list; this.start = start; this.end = end; } @Override public List<Object> call() throws Exception { Object obj = null; List<Object> retList = new ArrayList(); for(int i=start;i<end;i++){ obj = list.get(i); Thread.sleep(10);// System.out.println(Thread.currentThread()+"当前处理:"+obj); // System.out.println(UfileUtil.uploadUFile(obj.toString(),new FileInputStream("E:\\test.png"))); } //返回处理结果 return retList; } } }