1 package org.opendaylight.yangtools.triemap;
3 import java.util.Collection;
4 import java.util.Iterator;
5 import java.util.LinkedList;
7 import java.util.Map.Entry;
8 import java.util.concurrent.ConcurrentHashMap;
9 import java.util.concurrent.ExecutorService;
10 import java.util.concurrent.Executors;
11 import java.util.concurrent.TimeUnit;
13 import org.junit.Test;
15 public class TestMultiThreadMapIterator {
16 private static final int NTHREADS = 7;
19 public void testMultiThreadMapIterator () {
20 final Map<Object, Object> bt = new TrieMap<Object, Object> ();
21 for (int j = 0; j < 50 * 1000; j++) {
22 final Object[] objects = getObjects (j);
23 for (final Object o : objects) {
28 System.out.println ("Size of initialized map is " + bt.size ());
31 final ExecutorService es = Executors.newFixedThreadPool (NTHREADS);
32 for (int i = 0; i < NTHREADS; i++) {
33 final int threadNo = i;
34 es.execute (new Runnable () {
37 for (final Iterator<Map.Entry<Object, Object>> i = bt.entrySet ().iterator (); i.hasNext ();) {
38 final Entry<Object, Object> e = i.next ();
39 if (accepts (threadNo, NTHREADS, e.getKey ())) {
40 String newValue = "TEST:" + threadNo;
41 e.setValue (newValue);
50 es.awaitTermination (3600L, TimeUnit.SECONDS);
51 } catch (final InterruptedException e) {
57 for (final Map.Entry<Object, Object> kv : bt.entrySet ()) {
58 Object value = kv.getValue ();
59 TestHelper.assertTrue (value instanceof String);
62 TestHelper.assertEquals (50000 + 2000 + 1000 + 100, count);
64 final ConcurrentHashMap<Object, Object> removed = new ConcurrentHashMap<Object, Object> ();
67 final ExecutorService es = Executors.newFixedThreadPool (NTHREADS);
68 for (int i = 0; i < NTHREADS; i++) {
69 final int threadNo = i;
70 es.execute (new Runnable () {
73 for (final Iterator<Map.Entry<Object, Object>> i = bt.entrySet ().iterator (); i.hasNext ();) {
74 final Entry<Object, Object> e = i.next ();
75 Object key = e.getKey ();
76 if (accepts (threadNo, NTHREADS, key)) {
77 if (null == bt.get (key)) {
78 System.out.println (key);
81 if (null != bt.get (key)) {
82 System.out.println (key);
84 removed.put (key, key);
93 es.awaitTermination (3600L, TimeUnit.SECONDS);
94 } catch (final InterruptedException e) {
100 for (final Object value : bt.keySet ()) {
104 for (final Object o : bt.keySet ()) {
105 if (!removed.contains (bt.get (o))) {
106 System.out.println ("Not removed: " + o);
109 TestHelper.assertEquals (0, count);
110 TestHelper.assertEquals (0, bt.size ());
111 TestHelper.assertTrue (bt.isEmpty ());
114 protected static boolean accepts (final int threadNo, final int nThreads, final Object key) {
115 int val = getKeyValue (key);
117 return val % nThreads == threadNo;
122 private static int getKeyValue (final Object key) {
124 if (key instanceof Integer) {
125 val = ((Integer) key).intValue ();
127 else if (key instanceof Character) {
128 val = Math.abs (Character.getNumericValue ((Character) key) + 1);
130 else if (key instanceof Short) {
131 val = ((Short) key).intValue () + 2;
133 else if (key instanceof Byte) {
134 val = ((Byte) key).intValue () + 3;
140 static Object[] getObjects (final int j) {
141 final Collection<Object> results = new LinkedList<Object> ();
142 results.add (Integer.valueOf (j));
144 results.add (Character.valueOf ((char) j));
147 results.add (Short.valueOf ((short) j));
150 results.add (Byte.valueOf ((byte) j));
153 return results.toArray ();