map集合分割以及多线程处理数据

测试主线程,MapFetch.java

package com.sohu.servlet;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * @author liweihan ([email protected])
 * @version 1.0 (2015年7月27日 下午2:18:47)
 */
public class MapFetch {
	static Map<String, String> map = new HashMap<String, String>();

	public static void main(String[] args) {

		System.out.println("....test....");

		map.put("1", "one");
		map.put("2", "two");
		map.put("3", "three");

		for (int i = 0; i < 300000; i++) {
			map.put("key" + i, "value"+i);
		}

		//1.循环map
		/*Set<String> set = map.keySet();
		Iterator<String> it = set.iterator();
		while(it.hasNext()) {
			String key = (String) it.next();
			String value = map.get(key);
			System.out.println(key + " → " + value);
		}*/

		//2.循环map
		/*Set<Entry<String,String>> se = map.entrySet();
		for (Entry<String,String> en : se) {
			System.out.println(en.getKey() + " : " + en.getValue());
		}*/

		//3.循环map
/*		Set<Entry<String, String>> set = map.entrySet();
		Iterator<Entry<String, String>> iterator = set.iterator();

		while (iterator.hasNext()) {
			Entry<String, String> entry = iterator.next();
			String key = entry.getKey();
			String value = entry.getValue();
			System.out.println( key + " -- " + value);
		}*/

		//4.合并map
		/*Map<String, String> map1 = new HashMap<String, String>();
		map1.put("1", "one");

		Map<String, String> map2 = new HashMap<String, String>();
		map2.put("2", "two");

		map1.putAll(map2);

		System.out.println(map1);*/

		//5.分割map+多线程
/*		int totalSize = map.size();
		System.out.println("Map totalSize : " + totalSize);

		//线程的数量
		int threadNum = 16;
		//每个线程处理的数量
		int threadSize = totalSize / threadNum;
		System.out.println("每个线程处理的数量:" + threadSize);

		//join()线程
		List<Thread> threadList = new ArrayList<Thread>();

		for (int i = 0; i < threadNum; i++) {
			int end;
			if (i == threadNum - 1) {
				//最后一个线程
				end = threadSize + totalSize % threadNum ;
			} else {
				end = threadSize;
			}

			int beginNum = i * threadSize;
			int endNum = i * threadSize + end;
			System.out.println(i + " begin : " + beginNum  + "," + endNum);

			int sync = 0;
			//分割map
			Map<String, String> mapThread = new HashMap<String, String>();
			for(Entry<String, String> entry : map.entrySet()) {
				sync++;
				if (sync > beginNum && sync <= endNum) {
					mapThread.put(entry.getKey(), entry.getValue());
				}
			}
			StarRelationThread st = new StarRelationThread(mapThread,map,i);
			Thread thread = new Thread(st);
			threadList.add(thread);
			thread.start();

		}

		//join()线程-必须等join的线程执行完,才能继续执行下面的代码
		for (Thread thread : threadList) {
			try {
				thread.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		map.clear();
		System.out.println("------------over---------------");
*/		

		//6.map的分割
		Iterator<Entry<String, String>> iterator = map.entrySet().iterator();
		Map<String, String> mapThread0 = new HashMap<String, String>();
		Map<String, String> mapThread1 = new HashMap<String, String>();
		Map<String, String> mapThread2 = new HashMap<String, String>();
		Map<String, String> mapThread3 = new HashMap<String, String>();
		Map<String, String> mapThread4 = new HashMap<String, String>();
		Map<String, String> mapThread5 = new HashMap<String, String>();
		Map<String, String> mapThread6 = new HashMap<String, String>();
		Map<String, String> mapThread7 = new HashMap<String, String>();
		Map<String, String> mapThread8 = new HashMap<String, String>();
		Map<String, String> mapThread9 = new HashMap<String, String>();
		Map<String, String> mapThread10 = new HashMap<String, String>();
		Map<String, String> mapThread_default = new HashMap<String, String>();

		while (iterator.hasNext()) {
			Map.Entry<String, String> entry = iterator.next();
			String key = entry.getKey();
			String.valueOf(key);
			int hashCode = Math.abs(String.valueOf(key).hashCode());

			switch (hashCode % 11) {//分割成11份
			case 0 :
				mapThread0.put(key, map.get(key));
				break;
			case 1 :
				mapThread1.put(key, map.get(key));
				break;
			case 2 :
				mapThread2.put(key, map.get(key));
				break;
			case 3 :
				mapThread3.put(key, map.get(key));
				break;
			case 4 :
				mapThread4.put(key, map.get(key));
				break;
			case 5 :
				mapThread5.put(key, map.get(key));
				break;
			case 6 :
				mapThread6.put(key, map.get(key));
				break;
			case 7 :
				mapThread7.put(key, map.get(key));
				break;
			case 8 :
				mapThread8.put(key, map.get(key));
				break;
			case 9 :
				mapThread9.put(key, map.get(key));
				break;
			case 10 :
				mapThread10.put(key, map.get(key));
				break;
			default:
				mapThread_default.put(key, map.get(key));
				break;
			}
		}

		System.out.println(mapThread0.size());
		System.out.println(mapThread1.size());
		System.out.println(mapThread2.size());
		System.out.println(mapThread3.size());
		System.out.println(mapThread4.size());
		System.out.println(mapThread5.size());
		System.out.println(mapThread6.size());
		System.out.println(mapThread7.size());
		System.out.println(mapThread8.size());
		System.out.println(mapThread9.size());
		System.out.println(mapThread10.size());
		System.out.println(mapThread_default.size());

		int a = mapThread0.size() + 
				mapThread1.size() +
				mapThread2.size() +
				mapThread3.size() +
				mapThread4.size() +
				mapThread5.size() +
				mapThread6.size() +
				mapThread7.size() +
				mapThread8.size() +
				mapThread9.size() +
				mapThread10.size() +
				mapThread_default.size();
		System.out.println("a:" + a);
	}
}

业务处理子线程StarRelationThread.java

package com.sohu.servlet;

import java.util.Map;
import java.util.Map.Entry;

/**
 * @author liweihan ([email protected])
 * @version 1.0 (2015年7月27日 下午3:47:09)
 */
public class StarRelationThread implements Runnable{

	private Map<String, String> mapThread ;
	private Map<String, String> map ;
	private int threadNum;

	public StarRelationThread(Map<String, String> mapThread ,Map<String, String> map,int threadNum) {
		this.map = map;
		this.threadNum = threadNum;
		this.mapThread = mapThread;
	}

	@Override
	public void run() {
		System.out.println(" 第  " + threadNum + " 个线程处理-开始 ,此线程处理的数量 " + mapThread.size() + ",总的数量为:"+map.size());
		System.out.println("处理数据 ,并写入redis中");

		if (threadNum > 3) {
			try {
				Thread.sleep(20000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		int sync = 0;
		for (Entry<String, String> en : mapThread.entrySet()) {
			sync++;
			if (sync < 2) {
				System.out.println("key :" + en.getKey() + ", value :" + en.getValue());
			}
		}
		System.out.println(" 第 " + threadNum + " 个线程执行完毕!");
	}

}
时间: 2024-10-10 09:43:53

map集合分割以及多线程处理数据的相关文章

黑马程序员——黑马基础——Map,集合框架工具类Conlections和Arrays

黑马程序员--黑马基础--Map,集合框架工具类Conlections和Arrays ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一,Map集合 Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key). 特点: 1)该集合存储键值对,一对一对往里存 2)要保证键的唯一性. Map集合的子类 Map |--Hashtable:底层是哈希表数据结构,不可以存入null键nu

JAVA-查看MongoDB中的数据(包含Map集合)

package com.xinsight.server; import java.net.UnknownHostException; import java.util.HashMap; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.Mongo; /** *查找Mongo

java读取数据文件,将数据封装到List&lt;Map&gt;集合中

数据文件的格式:第一行是字段名称,用"|"分隔,第二行开始是数据,也用"|"分隔,如下图所示 解析分装到集合的代码如下: package com.ultra.aliyun.control.main; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.

多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)

多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有如下两种方式来实现这些Runnable对象之间的数据共享:            将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象.每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个

后台返回数据为map集合,前端js处理方法

当后台返回的数据不是json而是map集合的时候,前端js中处理就将其看作是一个数组,例如后台返回的代码入下: Map<String, String> result = new HashMap<String, String>(); map.put("code", "200"); map.put("title", result.get("title")); map.put("content&qu

Map集合框架的使用

Map用于保存具有映射关系的数据(key-vlaue).Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false Map中包含了一个keySet()方法,用于返回Map所以key组成的Set集合. Map集合与Set集合元素的存储形式很像,如Set接口下有HashSet.LinkedHashSet.SortedSet(接口).TreeSet.EnumSet等实现类和子接口,而Map接口下则有HashMap.LinkedHashMap.SortedMa

Map集合按照value和key进行排序

最近由于特殊的业务需求,需要做相关数据排序,下面就贴出其中的将map集合中按照value或者key进行排序的代码,后面再具体详说. 1 /** 2 * map 集合排序 3 * @param map 4 * @return 5 */ 6 public static <K, V extends Comparable<? super V>> Map<K, V> sortMap(Map<K, V> map) 7 { 8 List<Map.Entry<K

Map集合

在Map里面每一次可以存放两个对象,所有的对象按照“key = value”的形式保存.也就是说通过key可以找到对应的value. Collection存放数据的目的是为了输出,而Map存放数据的目的是为了查找. 在java.util中Map接口里面定义的方法如下: public V put(K key, V value) 普通 向Map集合之中保存数据 public V get(Object key) 普通 根据key取得对应的value数据 public boolean containsK

Map集合概述和特点

A:Map集合概述和特点(Set底层依赖的是Map) 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接口的不同 Map是双列的(是双列集合的根接口),Collection是单列的(是单列集合的根接口) Map的键唯一,Collection的子体系Set是唯一的 Map集合的数据结构值针对键有效,跟值无关;如:TreeMap:键是用二叉树算法,HashMap:键是hash算法, Collection集合的数据结构是针对元素有效 图解: