私はテーブルの周りに4人の人がいて、それぞれの間に1つのツールがあります。彼らは4つのスレッドに分かれていて、runメソッドは右と左のツールを選んで食べるように指示し、両方のツールをテーブルに戻して他の人が食べてもう一度やり直せるようにします。ここで条件が満たされていなくても終了するJavaマルチスレッド
ツールを選択するためにそれらのそれぞれを強制的に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;
}
}
そのコードはコンパイルされません。 – Andreas
*しかし、時にはそれは左になると終わるが、右はまだ間違っている... "*右。 '&& 'は" AND "を意味します。つまり、**両方の条件が真である間だけループが継続します(「AとB ...の間」)。 –
サイドノート: 'var == true'(または' false')や 'var!= true'(または' false')をブール値で使用するのは貧弱です。あなた**はすでに**ブール値を持っています。 'var == true'や' var!= false'ではなく、変数自体( 'var')を使って、' var!= true'や 'var == false'の代わりに'!var'を使います。 –