I have a ConcurrentMap that gets instantiated outside of my runnables, but shared and updated within / accross the runnables. My runnables need to be concurrent, but my conc
Solution based on Sotirios Delimanolis, Luiggi Mendoza, Sotirios Delimanolis answer.
main
public class ExecutionSubmitExample {
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(10);
List> tasks = new ArrayList<>();
ConcurrentHashMap concurrentMap = new ConcurrentHashMap<>();
for (int x = 0; x < 10; x++) {
Example e = new Example(concurrentMap, x);
Future future = es.submit(e, e);
tasks.add(future);
}
// -- all threads should be launching, let's get the ExecutionSubmitExample objects
try {
for (Future future : tasks) {
Example e = future.get();
}
for (Entry obj : concurrentMap.entrySet()) {
System.out.println("key " + obj.getKey() + " " + obj.getValue());
}
es.shutdown();
} catch (ExecutionException e) {
throw new RuntimeException(e);
} catch (InterruptedException ie) {
throw new RuntimeException(ie);
}
}
}
runnable
public class Example implements Runnable {
ConcurrentHashMap concurrentMap;
private int thread;
private final Object lock = new Object();
public Example(ConcurrentHashMap concurrentMap, int thread) {
this.concurrentMap = concurrentMap;
this.thread = thread;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
runAnalysis(i);
}
}
public void runAnalysis(int index) {
synchronized(lock) {
if(concurrentMap.containsKey(index)) {
System.out.println("contains integer " + index);
} else {
System.out.println("put " + index + " thread " + thread);
concurrentMap.put(index, "thread " + thread);
}
}
}
}
results
put 0 thread 0
contains integer 0
put 1 thread 7
put 2 thread 7
contains integer 1
contains integer 2
contains integer 0
contains integer 1
contains integer 2
contains integer 0
contains integer 1
contains integer 2
contains integer 0
contains integer 1
contains integer 2
contains integer 0
contains integer 1
contains integer 2
contains integer 0
contains integer 1
contains integer 2
contains integer 0
contains integer 1
contains integer 2
contains integer 0
contains integer 1
contains integer 2
contains integer 0
contains integer 1
contains integer 2
key 0 thread 0
key 2 thread 7
key 1 thread 7