0

次の実行可能なクラスがあります。

public class OnesRun implements Runnable {

    public int ones = 0;

    private int passendNumber;

    public OnesRun(int passendNumber) {
        this.passendNumber = passendNumber;
    }

    public void run() {
        if (passendNumber == 1)
            ones++;
    }

}

このクラスのすべてのインスタンスはones、1 に遭遇した場合に の値を増加させる必要があります。

onesすべてのスレッドが実行された後、クラスの外部からの値を読み取りたいと思います。

  1. ones スレッドセーフをインクリメントするにはどうすればよいですか?
  2. onesこのクラスの外からアクセスするにはどうすればよい ですか? 静的変数を介して?または、アプリケーションコンテキストに入れることはできますか?

編集:

次の疑似コードが私の意図をより明確にしてくれることを願っています。

OnesRun.ones = getCurrentValueOnes();

while ( (number = readNumbersFromFile) != null) {
   threadPool.execute(new OnesRun(number));
}

print("Overall values of ones " + OnesRun.ones);
4

2 に答える 2

7

スレッドセーフなものをインクリメントするにはどうすればよいですか?

を使用できますAtomicInteger

このクラスの外からアクセスするにはどうすればよいですか? 静的変数を介して?または、アプリケーションコンテキストに入れることはできますか?

単純なゲッターを使用できます。または、何か不足していますか?

アップデート

あなたの更新に基づいて、コードサンプルを変更する方法は次のとおりです。

public class OnesRun implements Runnable {

    private static final AtomicInteger ones = new AtomicInteger();

    private final int passendNumber;

    public OnesRun(int passendNumber) {
        this.passendNumber = passendNumber;
    }

    public void run() {
        if (passendNumber == 1)
            OnesRun.ones.incrementAndGet();
    }

    public static void setOnes(int newValue) {
        ones.set(newValue);
    }

    public static int getOnes() {
        return ones.get()
    }
}

...

OnesRun.setOnes(getCurrentValueOnes());

while ( (number = readNumbersFromFile) != null) {
   threadPool.execute(new OnesRun(number));
}

print("Overall values of ones " + OnesRun.getOnes());

既に説明しonesたこと (private static AtomicIntegerゲッター/セッターのペアの作成と追加) とは別に、私は両方のメンバーを作成しましたfinal。これは、特に並行コードでは、可能であれば常に推奨されます。

また、実装の詳細として保持されることにも注意してくださいAtomicInteger。クラスのパブリック インターフェイスによって公開されるわけではありません。

于 2011-04-06T12:30:38.290 に答える
0

AtomicInteger (スレッドセーフ) と静的プロパティを使用します。

public class OnesRun implements Runnable {
    private static final AtomicInteger ones = new AtomicInteger();

    private int passendNumber;

    public OnesRun(int passendNumber) {
        this.passendNumber = passendNumber;
    }

    public void run() {
        if (passendNumber == 1) {
            ones.incrementAndGet();
        }
    }

    public static AtomicInteger getOnes() {
        return ones;
    }
}


OnesRun.getOnes().set(getCurrentValueOnes());

while ( (number = readNumbersFromFile) != null) {
    threadPool.execute(new OnesRun(number));
}

print("Overall values of ones " + OnesRun.getOnes().get());
于 2011-04-06T12:51:43.967 に答える