Trying to synchronize method within runnable

后端 未结 4 1217
清歌不尽
清歌不尽 2020-12-21 22:45

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

4条回答
  •  悲&欢浪女
    2020-12-21 23:39

    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
    

提交回复
热议问题