0

私は、各スレッドが 2 つの数値の GCD を計算し、数値と GCD を に格納し、すべてのスレッドが終了TreeMapした後に を出力するマルチスレッド プログラムに取り組んでいます。TreeMap同時に 1 つのスレッドだけがデータを保存するようにするには、どのような方法を使用すればよいですか? また、印刷の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");
    }
4

3 に答える 3

1

syncronize(myMap) {...}マップへのシングル スレッド アクセスを保証する必要がある場所では、ブロックを使用する必要があります。

最後のスレッドで結果を出力する場合は、ブーリアン フラグを完了の合図として使用し、毎回確認することができます。volatile各スレッドがその値の変更を確認できるようにすることを忘れないでください。

UPD: Brian Goetz の「Java Concurrency In Practice」を読むことを強くお勧めします。

于 2013-01-17T05:29:21.807 に答える
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());
            }
}
于 2013-01-17T05:25:19.640 に答える
0

Collections.synchronizedMapを使用して、スレッドセーフにすることができます。そして、thread.joinを使用して、すべてのスレッドが死んでいる場合にのみ印刷が行われるようにします。

編集:メインスレッドで印刷を行います。印刷の直前に、joinすべてのスレッドを呼び出します。

于 2013-01-17T05:54:45.187 に答える