天天看点

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

测试主线程,MapFetch.java

<code>package</code> <code>com.sohu.servlet;</code>

<code>import</code> <code>java.util.ArrayList;</code>

<code>import</code> <code>java.util.HashMap;</code>

<code>import</code> <code>java.util.Iterator;</code>

<code>import</code> <code>java.util.List;</code>

<code>import</code> <code>java.util.Map;</code>

<code>import</code> <code>java.util.Map.Entry;</code>

<code>import</code> <code>java.util.Set;</code>

<code>/**</code>

<code> </code><code>* @author liweihan ([email protected])</code>

<code> </code><code>* @version 1.0 (2015年7月27日 下午2:18:47)</code>

<code> </code><code>*/</code>

<code>public</code> <code>class</code> <code>MapFetch {</code>

<code>    </code><code>static</code> <code>Map&lt;String, String&gt; map = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>

<code>        </code> 

<code>        </code><code>System.out.println(</code><code>"....test...."</code><code>);</code>

<code>        </code><code>map.put(</code><code>"1"</code><code>, </code><code>"one"</code><code>);</code>

<code>        </code><code>map.put(</code><code>"2"</code><code>, </code><code>"two"</code><code>);</code>

<code>        </code><code>map.put(</code><code>"3"</code><code>, </code><code>"three"</code><code>);</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; </code><code>300000</code><code>; i++) {</code>

<code>            </code><code>map.put(</code><code>"key"</code> <code>+ i, </code><code>"value"</code><code>+i);</code>

<code>        </code><code>}</code>

<code>        </code><code>//1.循环map</code>

<code>        </code><code>/*Set&lt;String&gt; set = map.keySet();</code>

<code>        </code><code>Iterator&lt;String&gt; it = set.iterator();</code>

<code>        </code><code>while(it.hasNext()) {</code>

<code>            </code><code>String key = (String) it.next();</code>

<code>            </code><code>String value = map.get(key);</code>

<code>            </code><code>System.out.println(key + " → " + value);</code>

<code>        </code><code>}*/</code>

<code>        </code><code>//2.循环map</code>

<code>        </code><code>/*Set&lt;Entry&lt;String,String&gt;&gt; se = map.entrySet();</code>

<code>        </code><code>for (Entry&lt;String,String&gt; en : se) {</code>

<code>            </code><code>System.out.println(en.getKey() + " : " + en.getValue());</code>

<code>        </code><code>//3.循环map</code>

<code>/*      Set&lt;Entry&lt;String, String&gt;&gt; set = map.entrySet();</code>

<code>        </code><code>Iterator&lt;Entry&lt;String, String&gt;&gt; iterator = set.iterator();</code>

<code>        </code><code>while (iterator.hasNext()) {</code>

<code>            </code><code>Entry&lt;String, String&gt; entry = iterator.next();</code>

<code>            </code><code>String key = entry.getKey();</code>

<code>            </code><code>String value = entry.getValue();</code>

<code>            </code><code>System.out.println( key + " -- " + value);</code>

<code>        </code><code>//4.合并map</code>

<code>        </code><code>/*Map&lt;String, String&gt; map1 = new HashMap&lt;String, String&gt;();</code>

<code>        </code><code>map1.put("1", "one");</code>

<code>        </code><code>Map&lt;String, String&gt; map2 = new HashMap&lt;String, String&gt;();</code>

<code>        </code><code>map2.put("2", "two");</code>

<code>        </code><code>map1.putAll(map2);</code>

<code>        </code><code>System.out.println(map1);*/</code>

<code>        </code><code>//5.分割map+多线程</code>

<code>/*      int totalSize = map.size();</code>

<code>        </code><code>System.out.println("Map totalSize : " + totalSize);</code>

<code>        </code><code>//线程的数量</code>

<code>        </code><code>int threadNum = 16;</code>

<code>        </code><code>//每个线程处理的数量</code>

<code>        </code><code>int threadSize = totalSize / threadNum;</code>

<code>        </code><code>System.out.println("每个线程处理的数量:" + threadSize);</code>

<code>        </code><code>//join()线程</code>

<code>        </code><code>List&lt;Thread&gt; threadList = new ArrayList&lt;Thread&gt;();</code>

<code>        </code><code>for (int i = 0; i &lt; threadNum; i++) {</code>

<code>            </code><code>int end;</code>

<code>            </code><code>if (i == threadNum - 1) {</code>

<code>                </code><code>//最后一个线程</code>

<code>                </code><code>end = threadSize + totalSize % threadNum ;</code>

<code>            </code><code>} else {</code>

<code>                </code><code>end = threadSize;</code>

<code>            </code><code>}</code>

<code>            </code> 

<code>            </code><code>int beginNum = i * threadSize;</code>

<code>            </code><code>int endNum = i * threadSize + end;</code>

<code>            </code><code>System.out.println(i + " begin : " + beginNum  + "," + endNum);</code>

<code>            </code><code>int sync = 0;</code>

<code>            </code><code>//分割map</code>

<code>            </code><code>Map&lt;String, String&gt; mapThread = new HashMap&lt;String, String&gt;();</code>

<code>            </code><code>for(Entry&lt;String, String&gt; entry : map.entrySet()) {</code>

<code>                </code><code>sync++;</code>

<code>                </code><code>if (sync &gt; beginNum &amp;&amp; sync &lt;= endNum) {</code>

<code>                    </code><code>mapThread.put(entry.getKey(), entry.getValue());</code>

<code>                </code><code>}</code>

<code>            </code><code>StarRelationThread st = new StarRelationThread(mapThread,map,i);</code>

<code>            </code><code>Thread thread = new Thread(st);</code>

<code>            </code><code>threadList.add(thread);</code>

<code>            </code><code>thread.start();</code>

<code>        </code><code>//join()线程-必须等join的线程执行完,才能继续执行下面的代码</code>

<code>        </code><code>for (Thread thread : threadList) {</code>

<code>            </code><code>try {</code>

<code>                </code><code>thread.join();</code>

<code>            </code><code>} catch (InterruptedException e) {</code>

<code>                </code><code>e.printStackTrace();</code>

<code>        </code><code>map.clear();</code>

<code>        </code><code>System.out.println("------------over---------------");</code>

<code>*/</code>     

<code>        </code><code>//6.map的分割</code>

<code>        </code><code>Iterator&lt;Entry&lt;String, String&gt;&gt; iterator = map.entrySet().iterator();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread0 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread1 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread2 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread3 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread4 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread5 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread6 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread7 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread8 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread9 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread10 = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>Map&lt;String, String&gt; mapThread_default = </code><code>new</code> <code>HashMap&lt;String, String&gt;();</code>

<code>        </code><code>while</code> <code>(iterator.hasNext()) {</code>

<code>            </code><code>Map.Entry&lt;String, String&gt; entry = iterator.next();</code>

<code>            </code><code>String.valueOf(key);</code>

<code>            </code><code>int</code> <code>hashCode = Math.abs(String.valueOf(key).hashCode());</code>

<code>            </code><code>switch</code> <code>(hashCode % </code><code>11</code><code>) {</code><code>//分割成11份</code>

<code>            </code><code>case</code> <code>0</code> <code>:</code>

<code>                </code><code>mapThread0.put(key, map.get(key));</code>

<code>                </code><code>break</code><code>;</code>

<code>            </code><code>case</code> <code>1</code> <code>:</code>

<code>                </code><code>mapThread1.put(key, map.get(key));</code>

<code>            </code><code>case</code> <code>2</code> <code>:</code>

<code>                </code><code>mapThread2.put(key, map.get(key));</code>

<code>            </code><code>case</code> <code>3</code> <code>:</code>

<code>                </code><code>mapThread3.put(key, map.get(key));</code>

<code>            </code><code>case</code> <code>4</code> <code>:</code>

<code>                </code><code>mapThread4.put(key, map.get(key));</code>

<code>            </code><code>case</code> <code>5</code> <code>:</code>

<code>                </code><code>mapThread5.put(key, map.get(key));</code>

<code>            </code><code>case</code> <code>6</code> <code>:</code>

<code>                </code><code>mapThread6.put(key, map.get(key));</code>

<code>            </code><code>case</code> <code>7</code> <code>:</code>

<code>                </code><code>mapThread7.put(key, map.get(key));</code>

<code>            </code><code>case</code> <code>8</code> <code>:</code>

<code>                </code><code>mapThread8.put(key, map.get(key));</code>

<code>            </code><code>case</code> <code>9</code> <code>:</code>

<code>                </code><code>mapThread9.put(key, map.get(key));</code>

<code>            </code><code>case</code> <code>10</code> <code>:</code>

<code>                </code><code>mapThread10.put(key, map.get(key));</code>

<code>            </code><code>default</code><code>:</code>

<code>                </code><code>mapThread_default.put(key, map.get(key));</code>

<code>        </code><code>System.out.println(mapThread0.size());</code>

<code>        </code><code>System.out.println(mapThread1.size());</code>

<code>        </code><code>System.out.println(mapThread2.size());</code>

<code>        </code><code>System.out.println(mapThread3.size());</code>

<code>        </code><code>System.out.println(mapThread4.size());</code>

<code>        </code><code>System.out.println(mapThread5.size());</code>

<code>        </code><code>System.out.println(mapThread6.size());</code>

<code>        </code><code>System.out.println(mapThread7.size());</code>

<code>        </code><code>System.out.println(mapThread8.size());</code>

<code>        </code><code>System.out.println(mapThread9.size());</code>

<code>        </code><code>System.out.println(mapThread10.size());</code>

<code>        </code><code>System.out.println(mapThread_default.size());</code>

<code>        </code><code>int</code> <code>a = mapThread0.size() + </code>

<code>                </code><code>mapThread1.size() +</code>

<code>                </code><code>mapThread2.size() +</code>

<code>                </code><code>mapThread3.size() +</code>

<code>                </code><code>mapThread4.size() +</code>

<code>                </code><code>mapThread5.size() +</code>

<code>                </code><code>mapThread6.size() +</code>

<code>                </code><code>mapThread7.size() +</code>

<code>                </code><code>mapThread8.size() +</code>

<code>                </code><code>mapThread9.size() +</code>

<code>                </code><code>mapThread10.size() +</code>

<code>                </code><code>mapThread_default.size();</code>

<code>        </code><code>System.out.println(</code><code>"a:"</code> <code>+ a);</code>

<code>    </code><code>}</code>

<code>}</code>

业务处理子线程StarRelationThread.java

<code> </code><code>* @version 1.0 (2015年7月27日 下午3:47:09)</code>

<code>public</code> <code>class</code> <code>StarRelationThread </code><code>implements</code> <code>Runnable{</code>

<code>    </code> 

<code>    </code><code>private</code> <code>Map&lt;String, String&gt; mapThread ;</code>

<code>    </code><code>private</code> <code>Map&lt;String, String&gt; map ;</code>

<code>    </code><code>private</code> <code>int</code> <code>threadNum;</code>

<code>    </code><code>public</code> <code>StarRelationThread(Map&lt;String, String&gt; mapThread ,Map&lt;String, String&gt; map,</code><code>int</code> <code>threadNum) {</code>

<code>        </code><code>this</code><code>.map = map;</code>

<code>        </code><code>this</code><code>.threadNum = threadNum;</code>

<code>        </code><code>this</code><code>.mapThread = mapThread;</code>

<code>    </code><code>@Override</code>

<code>    </code><code>public</code> <code>void</code> <code>run() {</code>

<code>        </code><code>System.out.println(</code><code>" 第  "</code> <code>+ threadNum + </code><code>" 个线程处理-开始 ,此线程处理的数量 "</code> <code>+ mapThread.size() + </code><code>",总的数量为:"</code><code>+map.size());</code>

<code>        </code><code>System.out.println(</code><code>"处理数据 ,并写入redis中"</code><code>);</code>

<code>        </code><code>if</code> <code>(threadNum &gt; </code><code>3</code><code>) {</code>

<code>            </code><code>try</code> <code>{</code>

<code>                </code><code>Thread.sleep(</code><code>20000</code><code>);</code>

<code>            </code><code>} </code><code>catch</code> <code>(InterruptedException e) {</code>

<code>        </code><code>int</code> <code>sync = </code><code>0</code><code>;</code>

<code>        </code><code>for</code> <code>(Entry&lt;String, String&gt; en : mapThread.entrySet()) {</code>

<code>            </code><code>sync++;</code>

<code>            </code><code>if</code> <code>(sync &lt; </code><code>2</code><code>) {</code>

<code>                </code><code>System.out.println(</code><code>"key :"</code> <code>+ en.getKey() + </code><code>", value :"</code> <code>+ en.getValue());</code>

<code>        </code><code>System.out.println(</code><code>" 第 "</code> <code>+ threadNum + </code><code>" 个线程执行完毕!"</code><code>);</code>

     本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/1680036,如需转载请自行联系原作者