单线程和多线程处理1W条数据对比代码
2017-08-01 17:42
399 查看
package study.interview; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.Random; import java.util.Set; public class TestEmailFromList { final static String[] list = {"qq.com","126.com","168.com","sina.com","baidu.com","soho.com","yeah.net","139.com","hotmail.com"}; public static void main(String[] args) throws InterruptedException { //email存放容器 LinkedList<Email> emailList = new LinkedList<Email>(); //统计各类邮箱使用人数容器 Map<String, Integer> mapEmail = new HashMap<String, Integer>(); //统计各类邮箱使用人数容器 Map<String, Integer> mapEmailPool = new HashMap<String, Integer>(); Random random=new Random(); //email原始邮箱初始化 for (int i = 0; i < 9999; i++) { int num = random.nextInt(9); emailList.add(new Email(String.valueOf(i+"@"+list[num]))); } // 单线程统计各类邮箱使用人数 long startTime = System.currentTimeMillis(); TestEmailFromList.countingBySingleThread(emailList, mapEmail); long endTime = System.currentTimeMillis(); System.out.println("单线程统计用时:"+(endTime-startTime)); //多线程统计各类邮箱使用人数 long startTime2 = System.currentTimeMillis(); //用多少个线程 TestEmailFromList.countingByMultiThread(emailList, mapEmailPool); long endTime2 = System.currentTimeMillis(); System.out.println("多线程统计用时:"+(endTime2-startTime2)); } /* * 单线程统计邮箱使用人数 */ public static void countingBySingleThread(LinkedList<Email> emailList,Map<String, Integer> mapEmail){ for (int i = 0; i <emailList.size(); i++) { String key = emailList.get(i).getUserName().split("@")[1]; if(mapEmail.containsKey(key)){ int value = mapEmail.get(key); mapEmail.put(key, ++value); }else{ mapEmail.put(key, 1); } } printMap(mapEmail); } /* * 多线程统计邮箱使用人数 */ public static void countingByMultiThread(LinkedList<Email> emailList,Map<String, Integer> mapEmailPool){ ExecutorService executorService = Executors.newCachedThreadPool(); List<Future<Map<String, Integer>>> resultList = new ArrayList<Future<Map<String, Integer>>>(); for (int i = 0; i < 4; i++) { LinkedList<Email> eList = null; if(i==3){ eList = new LinkedList<Email>(emailList.subList(i*2500,(i+1)*2500-1)); }else{ eList = new LinkedList<Email>(emailList.subList(i*2500,(i+1)*2500)); } System.out.println(eList.getFirst().getUserName()+"----"+eList.getLast().getUserName()); //使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中 Future<Map<String, Integer>> future = executorService.submit(new TaskWithResultMap( eList,mapEmailPool)); //将任务执行结果存储到List中 resultList.add(future); } //遍历任务的结果 for (Future<Map<String, Integer>> fs : resultList) { try { System.out.println(fs.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }finally{ executorService.shutdown(); } } printMap(mapEmailPool); } /* * 输出map */ public static void printMap(Map<String, Integer> mapEmail){ Set<Entry<String, Integer>> set = mapEmail.entrySet(); for (Entry<String, Integer> entry : set) { System.out.println("使用"+entry.getKey()+"的人共"+entry.getValue()); } } } class TaskWithResultMap implements Callable<Map<String, Integer>>{ LinkedList<Email> emailList; Map<String, Integer> mapEmailPool; public TaskWithResultMap(LinkedList<Email> emailList,Map<String, Integer> mapEmailPool){ this.emailList = emailList; this.mapEmailPool = mapEmailPool; } @Override public Map<String, Integer> call() throws Exception { synchronized (mapEmailPool) { for (int i = 0; i <emailList.size(); i++) { String key = emailList.get(i).getUserName().split("@")[1]; if(mapEmailPool.containsKey(key)){ int value = mapEmailPool.get(key); mapEmailPool.put(key, ++value); }else{ mapEmailPool.put(key, 1); } } } return mapEmailPool; } } class MyThread implements Runnable { LinkedList<Email> emailList; Map<String, Integer> mapEmailPool; public MyThread(LinkedList<Email> emailList,Map<String, Integer> mapEmailPool) { this.emailList = emailList; this.mapEmailPool = mapEmailPool; } public void run() { while(true){ synchronized (mapEmailPool) { try { for (int i = 0; i <emailList.size(); i++) { String key = emailList.get(i).getUserName().split("@")[1]; if(mapEmailPool.containsKey(key)){ int value = mapEmailPool.get(key); mapEmailPool.put(key, ++value); }else{ mapEmailPool.put(key, 1); } } } catch (Exception e) { System.out.println(Thread.currentThread().getName()+"异常"); } } } } } class Email { String username; public Email() { } public Email(String username) { this.username = username; } public String getUserName() { return username; } }
相关文章推荐
- 为什么多线程线程处理数据经常出现singnal异常,寻址异常
- ios后台处理数据存储线程的代码
- 六、线程的代码实现:pcb栈、线程栈、PCB初始化、中断处理函数、调度函数->多线程调度
- 黑马程序员-多线程-在android开发中经常会遇到从子线程切换到主线程,但是频繁地切换会使代码变得很臃肿,也不好维护,想请教一下各位大牛都是怎么处理的?
- 多线程共享数据的几种处理方式之synchronized
- JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止
- C++多线程处理数据
- ArcEngine加载数据及处理代数计算代码总结
- java并发-多线程之多个线程之间共享数据(6)
- Windows 窗体控件中的多线程处理之:如何使用后台线程搜索文件
- java大批量处理数据代码
- [原]Java多线程编程学习笔记之一:线程中断(含代码)
- 全面的MySQL处理重复数据代码
- Java多线程B站爬虫与45万条视频数据,mysql批量写入性能对比,附代码
- Java如何利用synchronized处理多线程的数据同步问题
- 单线程和多线程访问数据库性能比较二实现代码部分(oracle 数据库)
- Python大数据处理代码性能优化
- 具有自动截断功能的函数:对比:strcpy、strncpy、sprintf、snprintf在写入的数据大于缓冲区的情况下如何处理
- 新增线程,进行异步处理数据
- Java多个线程之间处理共享数据的方式