2

私のプログラムでは、サプライ変数を 2 ずつインクリメントする 1 つのスレッドがあり、別のスレッドがサプライ クラスから乱数のサプライを受け取ります。サプライ クラスは最大 5 つの値しか格納できません。スリープとサプライの要求はランダムであるため、サプライ カウントは最大制限を超えて増加する可能性があります。

私が確認しようとしているのは、その制限を超えていないということです。

これを行うより良い方法はありますか?

(疑似コード)

  1. 供給量を 2 増やす
  2. 供給が最大を超える場合は、供給を最大に割り当てます

コードは次のとおりです。

private int MAX = 5;
private int supply = 0;
public void run()
{
    while(true) {
      supply = supply + 2;
      if(supply > MAX) 
          supply = MAX;
    }
}
4

6 に答える 6

4

供給変数をインクリメントするために使用されるパブリック同期 incSupply() メソッドを使用できます。

public synchronized void incSupply()
{
    // Code borrowed from Jean-Bernard Pellerin.
    int temp = supply + 2;
    if (temp > MAX)
        temp = MAX;
    supply = temp;
}

「supply」変数との間で読み取り/書き込みを行う他のメソッドにも同期を使用する必要があることに注意してください。

于 2013-04-30T23:12:17.860 に答える
1

5 つの許可を持つセマフォを使用します。少し直観に反して、パーミットは物資を保管する許可を表していると思うので、最初のスレッドは物資を保管するための許可を取得する必要があります。2 番目のスレッドが供給を取得すると、この数の許可が解放されます。

于 2013-05-01T00:10:58.327 に答える
1
int temp = supply + 2;
if (temp > MAX)
  temp = MAX;
supply = temp;

ただし、これはまだスレッドセーフではありません。ロックと同期について調べる必要があります。

于 2013-04-30T23:10:11.230 に答える