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、同期、または揮発性ではないため、他のスレッドがその値が初期化されたことを確認する保証はありません。numThrは次のように宣言する必要がありますprivate static final int numThr=100

  3. スレッドSystem.out.println("sum = "+sum);の実行が完了する前に、が印刷されます。合計を出力する前に、スレッドに「参加」する(つまり、スレッドが完了するのを待つ)必要があります。追加:for(int i=0; i<numThr; i++) st[i].join();sysoutの前。

JavaメモリモデルとJavaの並行性について読んでおくべきだと思います。これが基本的なチュートリアルですが、このテーマに関する本が本当に必要です:http: //docs.oracle.com/javase/tutorial/essential/concurrency/

于 2012-05-22T02:05:59.240 に答える
0

はい、このコードにはいくつかの問題があります。これを修正する1つの方法は、時間をかけてJavaチュートリアルを読んで理解することです。別の方法は、他の誰かにそれを修正するように依頼することですが、この種のことはこの辺りではうまくいかないことに注意してください。

于 2012-05-22T02:03:20.477 に答える