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;
}
}

单线程和多线程处理1W条数据对比代码的更多相关文章

  1. 主要看思路:区域数据去重 + JavaScript一次性展示几万条数据实例代码

    近期做1功能,Gis地图 基于百度地图api , 会遇到的问题的, 如后台接口给的数据很多,大几千上万的,如果拿了数据直接渲染dom ,这滋味爽爽的. 再遇上 客户端浏览器悲催的,这卡顿就来了... ...

  2. 面试官:"准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?"

    // 预计存入 1w 条数据,初始化赋值 10000,避免 resize. HashMap<String,String> map = new HashMap<>(10000) ...

  3. 面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“

    通常在初始化 HashMap 时,初始容量都是根据业务来的,而不会是一个固定值,为此我们需要有一个特殊处理的方式,就是将预期的初始容量,再除以 HashMap 的装载因子,默认时就是除以 0.75. ...

  4. EDG夺冠!用Python分析22.3万条数据:粉丝都疯了!

    一.EDG夺冠信息 11月6日,在英雄联盟总决赛中,EDG战队以3:2战胜韩国队,获得2021年英雄联盟全球总决赛冠军,这个比赛在全网各大平台也是备受瞩目: 1.微博热搜第一名,截止2021-11-1 ...

  5. 从1KW条数据中筛选出1W条最大的数

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  6. json代码驾照考题批量加入MySQL数据库 ps.executeUpdate()永远只能悲催的加一条数据 去掉id主键自增 用foreach循环数据库只能出现一条语句

    package com.swift; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStrea ...

  7. Java备份约9亿条数据

    需求:有一张表9亿多条数据,数据加索引总数据量61GB.考虑到这张表的大部分数据都不会再被使用并且大数据量可能影响整库的性能,所以决定将表里某一个时刻之前的数据备份到一张新表中,待备份完成后将旧表中已 ...

  8. 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒

    链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...

  9. 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

    原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方 ...

随机推荐

  1. ubuntu18.04系统安装+基本环境配置【原创】

    平台信息:PC:ubuntu18.04.i5.七彩虹GTX1060显卡.固态硬盘.机械硬盘 作者:庄泽彬(欢迎转载,请注明作者) 说明:在原本的电脑买一个独立显卡,装上去之后,出了各种问题,虽然后面勉 ...

  2. 代理模式:利用JDK原生动态实现AOP

    代理模式:利用JDK原生动态实现AOP http://www.cnblogs.com/qiuyong/p/6412870.html 1.概述 含义:控制对对象的访问. 作用:详细控制某个(某类)某对象 ...

  3. Windows下查看文件MD5值

    有时候因为某些原因我们需要查看文件的MD5值,在Linux下这个就非常简单,只需要用md5sum命令即可,但是在Windows上却不知道对应的命令.今天就在网上查了一些,果然其实Windows也有对应 ...

  4. ffmpeg_资料_01

    1. 用ffmpeg制作推流工具,实现推流系统声音和桌面到rtmp服务器-CSDN论坛-CSDN.NET-中国最大的IT技术社区.html http://bbs.csdn.net/topics/392 ...

  5. spark + cassandra +postgres +codis 大数据方案

    1.环境: 1.1.cassandra 集群: 用于日志数据存储 1.2.spark集群: 用户后期的实时计算及批处理 1.3.codis 集群: 用于缓存一些基本数据如IP归属地,IP经纬度等,当日 ...

  6. Java IO流-Properties

    2017-11-05 21:37:50 Properties Properties:Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其 ...

  7. MySQL查询in操作排序

    in操作排序 先说解决方案: select * from test where id in(3,1,5) order by field(id,3,1,5); 或许有人会注意过,但我以前真不知道 SQL ...

  8. Autofac Mvc注入

    private void DependencyInjection() { var builder = new ContainerBuilder(); builder.RegisterControlle ...

  9. wikioi 1028 花店橱窗布置 最大权匹配

    中文题意不描述. 链接:http://wikioi.com/problem/1028/ 这题一开始很裸的最大权二分匹配.但是原来没有接触过,KM的这个最大权不大会.然后一开始以为用最大费用最大流直接就 ...

  10. hdu5818

    题解: 维护两个左偏树 按照左偏树模板来做 代码: #include<cstdio> #include<cmath> #include<algorithm> #in ...