-1

自分のタイプを自動ボックス化できないことを理解した後も、割り当て時に自動的に調整される値が必要なままです。これは機能しますか、それとも単にフリーズしますか?そうでない場合は、助けていただければ幸いです。

while(true){
    if(x){
        y=z
    }
}

注:クラスをより適切に説明すると役立つ場合があるため、ここで説明します。これは基本的に整数と同じですが、最大値と最小値が必要です。その値が>maxの場合、minから開始し、その逆も同様である必要があります。例:

LoopInteger i = new LoopInteger(0, 3, 0); //min, max, value
i.setValue(5); //When this is run, i need it to set the value to 1, as it is two more than the max of 3
i.setValue(-2); //The same here, except now it has to be set to 2, as it is two less than the min of 0.

基本的には、少なくとも構成可能な最大値で署名されていません。

4

2 に答える 2

1

次のように書かれていれば、そのようなものを(一種の)機能させることができます。

volatile boolean x;
...
while (true) {
   if (x) {
       y = z;
       break;
   }
}

(別のスレッドによって行われた更新を確実に確認するには、このスレッドに対してxvolatile として宣言するか、同期を使用する必要があることに注意してください。)synchronizedx

ただし、これはこれを実装する悪い方法です。x基本的に、スレッドは が に設定されるまでそのループを継続的に実行しますtrue。これは、システムのメモリ帯域幅を大量に使用してコアの 1 つを拘束し、マシンのバッテリーを消耗させます。

これを行うためのより良い方法は、xプライベートにして、変数が更新されたときに他のスレッドに通知するようにセッターを作成することです。

java.util.concurrentまたは、イベント/イベントリスナー、またはクラスの1つを使用して、実行しようとしているものをすべて実装してください。(あなたの例はあまりにも不自然なので、どれが最適かを提案するのは難しいです...)

于 2012-11-17T07:00:47.773 に答える
0

loop の終了条件が表示されないため、ループし続けます。以下の2つのうちの1つを行うことができると思います。

  1. 使用break:

     while(true){
       if(x){
          y=z;
          break;
       }
    }
    
  2. ステータス フラグの使用:

     boolean found = false;
     while(!found){
       if(x){
          y=z;
          found = true;
       }
    }
    

また、100 ミリ秒 (Thread.sleep(100)); など、ループ内に時間間隔を置くことをお勧めします。それ以外の場合は、継続的にループし、ユニットxの条件が満たされます。

于 2012-11-17T06:32:42.390 に答える