0

此代码从不同的蒸汽数据中读取数字,并输出总和。这段代码有问题吗?我该如何解决?

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);
}
}
4

2 回答 2

1

一开始就有很多事情是错误的。

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

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

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

  2. “numThr”在多个线程之间共享,由多个线程读取。由于 numThr 不是 final、synchronized 或 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/

于 2012-05-22T02:05:59.240 回答
0

是的,这段代码有几个问题。解决它的一种方法是花时间阅读和理解Java 教程。另一种方法是请其他人为您修复它,但请注意,这种事情不会在这里得到很好的解决。

于 2012-05-22T02:03:20.477 回答