java - Java中的多线程和同步

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

最佳答案

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

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

UPD:Brian Goetz 的《Java 并发实践》是强烈推荐阅读的一本书。

关于java - Java中的多线程和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14372668/

相关文章:

java - Android:如何使用 grantUriPermission 来创建和发送带有位图附件的电子邮件

java - Java中如何实现多线程

c# - 实现具有中止能力的方法

java - Netty UDP 服务器可以有多个 eventloop 线程吗?

java - 如何从 adf 中的其他用户验证其他用户的身份?

java - 我如何编写一个执行此操作的 ClassLoader?

java - 通过 Random 类和排序为数组生成数据

java - 安卓RTP。不兼容类型 : Object cannot be converted.

C++优先考虑线程间的数据同步

java - obj.notify() 似乎不起作用