java - 在多线程环境中清除嵌套循环中的 Map

标签 java multithreading executorservice

我正在多线程环境中工作,其中有一个同步多重映射。我在嵌套循环中使用该映射,并且我想清除该嵌套循环中每个事务的值。我怎样才能实现这一目标:

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();
        }
    }

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

最佳答案

您正在执行器中同时运行所有操作(好吧,一次 10 个)。这些调用在这里:

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

不是同步块(synchronized block)的一部分,并且来自多个线程的指令可以在它们之间交错,例如以下是线程 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);

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

关于java - 在多线程环境中清除嵌套循环中的 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45719375/

相关文章:

java - 核心 Java 线程和 Volatile 关键字用法

c++ - 使用OpenSSL和锁的多线程程序随机崩溃

c++ - C++多线程关闭TCP连接

c++ - 在共享模式下锁定的 std::shared_mutex 上调用解锁

java - 使用 ExecutorService 观察 Future<T> 对象的完成情况

java - 在后台线程中运行的可编辑任务队列

java - 如何立即将任务从一个线程池传输到另一个线程池?

java - 正确使用 JRSwapFileVirtualizer?

java - 检查浏览器是否支持盲人或部分视力的人?

java - 更改 apache Camel 的 http 响应和正文响应