Java 清除多线程环境中嵌套循环中的映射

Java 清除多线程环境中嵌套循环中的映射,java,multithreading,executorservice,Java,Multithreading,Executorservice,我在一个多线程环境中工作,在那里我有一个同步的多映射。我在嵌套循环中使用该映射,我希望清除该嵌套循环中每个事务的值。我怎样才能做到这一点: public class Test1 { public static void main(String[] args){ ExecutorService executor = Executors.newFixedThreadPool(10); final Multimap<Object, Object> m

我在一个多线程环境中工作,在那里我有一个同步的多映射。我在嵌套循环中使用该映射,我希望清除该嵌套循环中每个事务的值。我怎样才能做到这一点:

public class Test1 {
    public static void main(String[] args){
        ExecutorService executor = Executors.newFixedThreadPool(10);
        final Multimap<Object, Object> map = Multimaps.synchronizedMultimap(ArrayListMultimap.create());

        final List<String> listA = new ArrayList<String>();
        listA.add("e");
        listA.add("f");
        listA.add("g");
        final List<String> listB = new ArrayList<String>();
        listB.add("e");
        listB.add("f");
        listB.add("g");
        final List<String> listC = new ArrayList<String>();
        listC.add("e");
        listC.add("f");
        listC.add("g");

        for (final String stateId : listA) {
            for (final String gradeList : listB) {
                for (final String subjectList : listC) {
                    executor.execute(new Runnable() {
                        @Override
                        public void run() {
                            map.clear();
                            map.put("f", "hi");
                            System.out.println("map before "+map);
                            System.out.println("map after "+map);
                        }
                    });
                }
            }
        }

        executor.shutdown();
        try {
            executor.awaitTermination(24L, TimeUnit.HOURS);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

但这并不能产生正确的输出。有时我可以看到多个值,有时我在打印地图时看不到任何值。有人可以建议对此进行更改吗?

您正在执行器中同时运行所有操作,一次运行10次。这些电话:

        map.clear();
        map.put("f", "hi");
        System.out.println("map before "+map);
        System.out.println("map after "+map);
不是同步块的一部分,来自多个线程的指令可以在它们之间交错,例如,以下是跨线程T1和T2的有效交错:

 T1:       map.clear();
 T2:       map.clear();
 T1:       map.put("f", "hi");
 T2:       map.put("f", "hi");
 T2:       System.out.println("map before "+map);
 T1:       System.out.println("map before "+map);
 T1:       System.out.println("map after "+map);
 T2:       System.out.println("map after "+map);

我将把如何跨多个指令同步作为练习留给读者。

明白了!!非常感谢你的清楚解释。我在地图上使用了同步块,效果很好。非常感谢你的完美解释@Tassosbassoukos这是我正在寻找的解决方案。但同步在这里造成了严重的性能问题。它需要花费很长时间才能完成。它需要进行大约5000次API调用,并且需要花费很长时间才能完成。有什么解决办法吗?请不要使用共享状态,在持有锁时不要使用网络呼叫。或者,使用rxjava+改造之类的工具。