多线程和Java中的同步

时间:2013-01-17 05:23:13

标签: 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(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");
    }

3 个答案:

答案 0 :(得分:1)

您必须在需要保证单线程访问地图的地方使用syncronize(myMap) {...}块。

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

UPD: Brian Goetz强烈推荐阅读“Java Concurrency In Practice”。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以使用Collections.synchronizedMap使其线程安全。并使用thread.join确保仅在所有线程都已死时才进行打印。

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