我们在做多线程的时候要考虑到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编辑和识别的文件),请看我的博客,里面有描写到!