Java中的多线程与同步

Java中的多线程与同步,java,multithreading,Java,Multithreading,我正在开发一个多线程程序,其中每个线程计算两个数字的GCD,将数字和GCD存储到TreeMap,并在所有线程完成后打印出TreeMap。我应该使用什么样的方法来确保只有一个线程同时存储数据,以及在准备打印时如何使用最后一个线程打印TreeMap for (int i = 0; i < myList.size(); ++i) { for (int j = i + 1; j < myList.size(); ++j) { modulus1 = myList.get

我正在开发一个多线程程序,其中每个线程计算两个数字的GCD,将数字和GCD存储到
TreeMap
,并在所有线程完成后打印出
TreeMap
。我应该使用什么样的方法来确保只有一个线程同时存储数据,以及在准备打印时如何使用最后一个线程打印
TreeMap

for (int i = 0; i < myList.size(); ++i) {
    for (int j = i + 1; j < myList.size(); ++j) {
        modulus1 = myList.get(i);
        modulus2 = myList.get(j);
        pool.execute(new ThreadProcessRunnable(modulus1, modulus2, myMap));
    }
}

public void run() {
    ThreadProcess process = null;
    try {
        // Only one thread should execute the following code
        for (Map.Entry<BigInteger, ArrayList<BigInteger>> entry : myMap.entrySet()) {
            System.out.println("key ->" + entry.getKey() + ", value->" + entry.getValue());
        }
    } catch (Exception e) {
        System.err.println("Exception ERROR");
    }
for(int i=0;i”+entry.getKey()+”,value->“+entry.getValue());
}
}捕获(例外e){
System.err.println(“异常错误”);
}
//只有一个线程应该执行以下代码
同步{
对于(Map.Entry:myMap.entrySet()){
System.out.println(“key->”+entry.getKey()+”,value->“+entry.getValue());
}
}

在需要保证单线程访问映射的地方,必须使用
syncronize(myMap){…}

至于按最后一个线程打印结果,您可以使用布尔标志作为完整性的信号,并每次检查它。不要忘记将其设置为volatile,让每个线程看到其值的变化

UPD:Brian Goetz“Java并发实践”是一本强烈建议阅读的书。

您可以使用它来确保线程安全。并且使用它来确保只有在所有线程都死机时才进行打印


编辑:在主线程中进行打印。在打印之前,在所有线程上调用
join

访问数据的方法似乎您的
for
循环只应该是
if
check?
List List List=myMap.get(firstmodule);if(List==null){List=new ArrayList();myMap.put(firstmodule,List);}list.add(gcd);
(这样就不需要使用
if(myMap.size()>0){…}else{…}
,并使其更具可读性)看一看像这样的线程通信讨论同一个问题与此有关,这是Quoi的解决方案。Join等待线程死亡。我如何知道所有线程何时完成。谢谢。布尔标志在每个线程中都起作用?应该在哪里检查条件?
          //Only one thread should executes the following code
synchronize{            
for (Map.Entry<BigInteger, ArrayList<BigInteger>> entry : myMap.entrySet()) {
                System.out.println("key ->" + entry.getKey() + ", value->" + entry.getValue());
            }
}