请检查如下代码,如有问题,请正确指出!(java、多线程)
2017-08-24 11:44
381 查看
package com.test.thread; import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.List; import java.util.concurrent.*; public class Test { private static ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); public void execute() { long startTime = System.currentTimeMillis(); System.out.println(" ------------ execute task execute ! ------------------- "+startTime); List<Integer> recordIds = Lists.newArrayList(); int threadNum = 1; String fileName = "../data.txt"; File file = new File(fileName); BufferedReader reader = null; CompletionService<String> service = new ExecutorCompletionService<String>(executor); int line = 1; try { System.out.println("以行为单位读取文件内容,一次读一整行:"); reader = new BufferedReader(new FileReader(file)); String tempString = null; // 一次读入一行,直到读入null为文件结束 while ((tempString = reader.readLine()) != null) { // 显示行号 System.out.println("line " + line + ": " + tempString); Integer recordId = Integer.valueOf(tempString.trim()); recordIds.add(recordId); if(recordIds.size()%100==0){ service.submit(new ThreadTask(recordIds,String.valueOf(threadNum))); recordIds.clear(); threadNum++; } } if(recordIds.size()>0){ service.submit(new ThreadTask(recordIds,String.valueOf(threadNum))); } for (int i = 1; i <= threadNum; i++) { try { Future<String> future = service.take(); String result = future.get(); System.out.println(" --------------- 线程执行完成结果 :------------------- "+result); } catch (Exception e) { e.printStackTrace(); } } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } long endTime = System.currentTimeMillis(); System.out.println(" ------------ execute task execute ! ------------------- "+(endTime-startTime)/1000+" 秒!"); } class ThreadTask implements Callable<String> { private List<Integer> recordIds; private String name; public ThreadTask(List<Integer> recordIds,String name) { this.recordIds = recordIds; this.name = name; } @Override public String call() throws Exception { long startTime = System.currentTimeMillis(); if (CollectionUtils.isEmpty(recordIds)) { return null; } System.out.println(name +" , recordIds.size(): " +recordIds.size()+" ------------ thread is start execute ! ---------- "+startTime); // ... 任务处理 long endTime = System.currentTimeMillis(); System.out.println(name + " ------------ thread is end execute ! ------------ "+endTime+ "---------- 共耗时: "+(endTime-startTime)/1000+" 秒! "); return name+ " success!"; } } }
相关文章推荐
- 一个问题阻止WINDOWS正确检查此机器的许可证,错误代码为0x8007000
- 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)
- 关于进入windows界面时,提示了:一个问题阻止windows正确检查此机器许可证,错误代码为:
- 一个问题阻止windows正确检查此机器的许可证。错误代码0x80070002
- 关于更新windows Service Pack 3 更新后系统登录出现“一个问题阻止Windows正确检查机器的许可证。错误代码 0x80070002”问题解决方案
- 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)(r)
- java代码多线程实现如下
- 一个问题阻止windows正确检查此机器的许可证。错误代码0x80070002
- 转: 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)
- java多线程解决同步问题的几种方式、原理和代码
- 一个问题阻止windows正确检查此机器的许可证 错误代码:0x80070002
- 如何实现多个线程同步 (2013-11-10 12:07:24)转载▼ 标签: it 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多
- 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)
- java代码实现多线程消费者生产者问题。
- 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)
- 一个问题阻止windows正确检查次机器的许可证,错误代码:Ox80070002
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
- Java 多线程 生产者与消费者问题测试代码
- 【Java并发编程】:第五篇中volatile意外问题的正确分析解答(含代码)
- 遇到问题----java---多线程----线程数一直增加----web项目中线程池的正确使用方式