单线程和多线程处理1W条数据对比代码
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条数据对比代码的更多相关文章
- 主要看思路:区域数据去重 + JavaScript一次性展示几万条数据实例代码
近期做1功能,Gis地图 基于百度地图api , 会遇到的问题的, 如后台接口给的数据很多,大几千上万的,如果拿了数据直接渲染dom ,这滋味爽爽的. 再遇上 客户端浏览器悲催的,这卡顿就来了... ...
- 面试官:"准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?"
// 预计存入 1w 条数据,初始化赋值 10000,避免 resize. HashMap<String,String> map = new HashMap<>(10000) ...
- 面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“
通常在初始化 HashMap 时,初始容量都是根据业务来的,而不会是一个固定值,为此我们需要有一个特殊处理的方式,就是将预期的初始容量,再除以 HashMap 的装载因子,默认时就是除以 0.75. ...
- EDG夺冠!用Python分析22.3万条数据:粉丝都疯了!
一.EDG夺冠信息 11月6日,在英雄联盟总决赛中,EDG战队以3:2战胜韩国队,获得2021年英雄联盟全球总决赛冠军,这个比赛在全网各大平台也是备受瞩目: 1.微博热搜第一名,截止2021-11-1 ...
- 从1KW条数据中筛选出1W条最大的数
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- json代码驾照考题批量加入MySQL数据库 ps.executeUpdate()永远只能悲催的加一条数据 去掉id主键自增 用foreach循环数据库只能出现一条语句
package com.swift; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStrea ...
- Java备份约9亿条数据
需求:有一张表9亿多条数据,数据加索引总数据量61GB.考虑到这张表的大部分数据都不会再被使用并且大数据量可能影响整库的性能,所以决定将表里某一个时刻之前的数据备份到一张新表中,待备份完成后将旧表中已 ...
- 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒
链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...
- 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)
原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方 ...
随机推荐
- [UI基础][实现]九宫格之应用程序管理
[目标] 1.完成下图所示的View,View中的图片.文字数据从app.list文件读出. 2.思考代码哪里可以进行优化. [分析] 1.创建控件 整个View分12个部分,其中包含一个 UIIma ...
- Git WorkBehavior
https://tortoisegit.org/docs/tortoisegit/tgit-dug-showlog.html Repository Demo https://github.com/Ch ...
- Command(命令)
意图: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 适用性: 抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(call ...
- 51nod1289 stack
1289 大鱼吃小鱼 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动 ...
- Granting and Managing Item Level Permission using SharePoint2013 Designer Workflow
https://gnanasivamgunasekaran.wordpress.com/2015/12/29/granting-and-managing-item-level-permission-u ...
- 12.2 Web窗体--代码片段详解
第12章 使用Web窗体 ※ 除常规HTML元素之外,Web窗体文件还包含另外3种内容:代码片段.可编程HTML元素和控件 ※ 代码隐藏类只应包含特定于单个Web窗体的代码.如果存在多个Web窗体 ...
- createjs记录坑
1.使用preloadjs加载资源: manifest = [ {src: "block.png", id: "ground"}, {src: "re ...
- notepad++支持自定义文件类型
场景描述: 使用notepad++编辑less.ejs文件,发现高亮和提示均无效,修改如此需要进行额外的设置: 解决方法: 以less为例, 1.设置 >语言格式设置 >语言里找到CSS, ...
- POJ 3414 dfs 回溯
题目链接:http://poj.org/problem?id=3414 题意:三个值A, B, C, A和B是两个杯子的容量,问最短操作数使A或者B里的水量是C.有三种操作. 思路:dfs.暴力 很简 ...
- c primer plus 5 读书笔记1
C语言是一种融合了控制特性的语言,是一种快速.高效.紧凑.可移植性的语言. 使用C语言的7个步骤:定义程序目标.设计程序.编写代码.编译程序.运行程序.测试和调试程序.维护和修改程序. c程序是由一个 ...