List分段处理多线程导出

我们在做多线程的时候要考虑到IO瓶颈,特别是读写本地磁盘文件的时候就会占用到大量的内存空间和cpu使用率,这时候不建议用多线程进行操作,但是在访问远程服务的时候就可以(包括远程数据库访问)用多线程处理技术,我这里是一个List集合数据处理,要通过远程服务调用返回的结果来拼接数据,这里面用到了线程池.返回的结果写进了本地json文件,我们主要通过在访问远程服务的时间差来做多线程,最大的利用了cpu的使用效率!

public void exportByThread(List<Map<String,Object>> list) throws Exception{
		        // 开始时间
		        long start = System.currentTimeMillis();

		        // 每500条数据开启一条线程
		        int threadSize = 500;
		        // 总数据条数
		        int dataSize = list.size();
		        // 线程数
		        int threadNum = dataSize / threadSize + 1;
		        // 定义标记,过滤threadNum为整数
		        boolean special = dataSize % threadSize == 0;

		        // 创建一个线程池
		        ExecutorService exec = Executors.newFixedThreadPool(threadNum);
		        // 定义一个任务集合
		        List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
		        Callable<Integer> task = null;
		        List<Map<String,Object>> cutList = null;

		        // 确定每条线程的数据
		        for (int i = 0; i < threadNum; i++) {
		            if (i == threadNum - 1) {
		                if (special) {
		                    break;
		                }
		                cutList = list.subList(threadSize * i, dataSize);
		            } else {
		                cutList = list.subList(threadSize * i, threadSize * (i + 1));
		            }
		            // System.out.println("第" + (i + 1) + "组:" + cutList.toString());
		            final List<Map<String,Object>> listStr = cutList;
		            task = new Callable<Integer>() {

		                @Override
		                public Integer call() throws Exception {
		                    System.out.println(Thread.currentThread().getName() + "线程:" + listStr);
		                    doSomeThing(listStr);
		                    return 1;
		                }
		            };
		            // 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
		            tasks.add(task);
		        }

		        List<Future<Integer>> results = exec.invokeAll(tasks);

		        for (Future<Integer> future : results) {
		            System.out.println(future.get());
		        }

		        // 关闭线程池
		        exec.shutdown();

			System.out.println("线程任务执行结束");
			System.err.println("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");

			writeJsonToLocal(JSONArray.fromObject(list).toString());
			
		
	    }
	    private static void writeJsonToLocal(String str) throws Exception{
	    	 File file = new File("E://5.json");
	    		if(!file.exists()){
	    			file.createNewFile();
	    		}
    		    FileWriter fw = new FileWriter(file);
    			BufferedWriter out = new BufferedWriter(fw);
    			out.write(str);
    			out.close();
	    }
	    private static void doSomeThing(List<Map<String,Object>> list ){
	    	
	    	//远程访问服务来拼接数据的代码... 
	    }
	    

在使用多线程技术的时候要注意使用多线程的必要性!,否则会得不偿失,可能会降低效率.本例是导出到json文件,当然也可以导出到csv文件(可以用excel编辑和识别的文件),请看我的博客,里面有描写到!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值