gpt4 book ai didi

java线程不同的流

转载 作者:行者123 更新时间:2023-12-01 15:22:31 25 4
gpt4 key购买 nike

此代码从不同的 Steam 数据中读取数字,并输出整个总和。这段代码有问题吗?我该如何修复它?

public class Thr extends Thread{
static int numThr=100, sum=0;
private int num;
private Thr(int num){this.num =num;}
public void run() {
int k = IntegerReader.get(num);
int count=0;
while(k>0) {
if(count%numThr==num) sum+=k;
count++;
k=IntegerReader.get(num);
}
}
public static void main(String[] a) throws Exception {
thr[] st =new thr[numThr];
for(int i=0; i<numThr; i++) st[i] = new Thr(i);
for(int i=0; i<numThr; i++) st[i].start();
System.out.println("sum = "+sum);
}
}

最佳答案

立刻就出现了很多问题。

  1. Sum 在多个线程之间共享,并在多个线程中递增,这意味着您可能会得到不一致的值,因为递增值不是原子操作。

    最简单的解决方法是将 sum 的声明更改为: private static AtomicInteger sum = new AtomicInteger(0);

    并以这种方式添加: sum.getAndAdd(k)

  2. “numThr”在多个线程之间共享并由多个线程读取。由于 numThr 不是最终的、同步的或 volatile 的,因此不能保证其他线程会看到它的值已被初始化。 numThr 应声明为 private static final int numThr=100

  3. 您的System.out.println("sum = "+sum);将在线程完成执行之前打印。在打印总和之前,您需要“加入”线程(即等待它们完成)。地址:for(int i=0; i<numThr; i++) st[i].join();在你的系统输出之前。

我认为您应该阅读 Java 内存模型和 Java 并发性。这是一个基本教程,但您确实需要一本关于该主题的书: http://docs.oracle.com/javase/tutorial/essential/concurrency/

关于java线程不同的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com