2017-10-19 10 views
-2

私はテーブルの周りに4人の人がいて、それぞれの間に1つのツールがあります。彼らは4つのスレッドに分かれていて、runメソッドは右と左のツールを選んで食べるように指示し、両方のツールをテーブルに戻して他の人が食べてもう一度やり直せるようにします。ここで条件が満たされていなくても終了するJavaマルチスレッド

enter image description here

ツールを選択するためにそれらのそれぞれを強制的にwhileループです。彼らのクラスにあり、私はそれをrunメソッドから呼び出します。

public void sbirejHulky() throws InterruptedException 
    { 
     while((left != true) && (right != true)) 
     { 
      right = rightTool.getTool(this); // try to grab right tool 
      aktualizuj(); // This actualise the graphic 
      Thread.sleep(Filozofove.getRandom()); 
      left = leftTool.getTool(this); // try to grab left tool 
      Thread.sleep(Filozofove.getRandom()); 
      aktualizuj(); 
      System.out.println("this.right +" "+this.left); 
     } 
    } 

これは長く実行する必要がありますが、左と右の両方が正しくありませんか?しかし時にはそれは左になると終わりますが、右はまだ間違っています。

メソッドgetToolは同期され、ツールがグラブに成功した場合はtrueを返し、誰かがこの時点でそれを持っている場合はfalseを返します。

私はあなたの条件は、左右両方が偽である間、ループは継続すべきであることを意味し、それはそれらのいずれかが一旦停止任意のヘルプ


編集

public synchronized boolean getTool(Filozof filozof) throws InterruptedException 
    { 
    if (owner != null) 
      { 
      if(filozof.isRight()) 
        { 
         filozof.setRight(filozof.getRightTool().putToolBack()); 
        } 
      if(filozof.isLeft()) 
        { 
         filozof.setLeft(filozof.getLeftTool().putToolBack()); 
        } 
        return false; 
      } 
      else 
      { 
      owner = filozof; 
      return true; 
      } 
    } 
+1

そのコードはコンパイルされません。 – Andreas

+4

*しかし、時にはそれは左になると終わるが、右はまだ間違っている... "*右。 '&& 'は" AND "を意味します。つまり、**両方の条件が真である間だけループが継続します(「AとB ...の間」)。 –

+0

サイドノート: 'var == true'(または' false')や 'var!= true'(または' false')をブール値で使用するのは貧弱です。あなた**はすでに**ブール値を持っています。 'var == true'や' var!= false'ではなく、変数自体( 'var')を使って、' var!= true'や 'var == false'の代わりに'!var'を使います。 –

答えて

1

のために喜んでいるでしょう本当。 while((left != true) || (right != true))を試してください。つまり、ループが両方とも真である場合にのみループが停止します。

+0

なぜですか?あなたは何を変えましたか? *なぜあなたはそれを変えましたか?コードダンプは*役に立つ*答えではありません。 *(私のDVDではない)* –

+0

これは動作します、問題は条件にあった、あなたは正しい...あなたの助けをありがとう:) –

-1

まずは、少し単純化してみましょう:

while (!left && !right) { 

今度は、真理値表を適用してみましょう:

left == true 
right == false 

!left && !right 
false && true == false 
を次の

!left == false 
!right == true 

を次の

はい、ループは終了します。

+0

ハァッか。 '!left &&!right = false && true = false' ??代入演算子? – Andreas

3

このステートメントは、「2つのプラス2つが5つであり、私は脱毛ではありません。頭の中にどれくらいの髪の毛があるかにかかわらず、この声明は偽りです。 ANDの両側が満たされていれば、それは1つだけです。

(left != true) && (right != true) 

left != trueが偽であれば同様に、これは関係なくrightの値を、偽です。

while((left != true) && (right != true)) 

これは、条件が真の間だけループを続け、left != trueがfalseの場合は条件が真ではありません。したがって、rightの値にかかわらず、lefttrueの場合は停止します。

今後は、left != trueのようなことをしないでください。 leftはすでに真または偽のブール値なので、ブール値にするために比較する必要はありません。それを逆にする場合は、!leftを使用してください。これを行うには

単純、そして正しい、方法は次のようになります。

while (! (left && right)) 

left && rightが真であるときには完了です。だから、そうではない間もループを続けたいと思う。

+0

ありがとう、あなたの提案も働く:)問題は本当に条件そのものにあった。 –

関連する問題