我桌子周围有4个人,每个人之间都有一个工具。它们是4个独立的线程,它们的运行方法告诉它们在左右两侧选择工具并进食,然后将两个工具放回到桌面上,这样其他人也可以吃掉并再次完成。
这是一个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,则返回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;
}
}
答案 0 :(得分:3)
这句话是真还是假,“两加二是五而我不是秃头”。无论我头上有多少头发,这种说法都是错误的。只有AND的双方都满意,并且只有一个是。
(left != true) && (right != true)
同样,如果left != true
为false,则无论right
的值是多少,这都是错误的。
while((left != true) && (right != true))
仅当条件为真时才继续循环,如果left != true
为假,则条件不为真。因此,如果left
为true
,则会停止,无论right
的值是多少。
将来不要做left != true
之类的事情。由于left
已经是一个true或false的布尔值,因此您无需比较它以使其成为布尔值。如果要将其反转,请使用!left
。
更简单,更正确的方法是:
while (! (left && right))
当left && right
成立时你已经完成了。所以你想保持循环,而事实并非如此。
答案 1 :(得分:1)
你的条件意味着循环应该继续,而右边和左边都是假的,并且一旦它们中的任何一个为真就停止。您应该尝试使用while((left != true) || (right != true))
,这意味着只有在两者都为真时循环才会停止。
答案 2 :(得分:-1)
首先,让我们简化一下:
while (!left && !right) {
现在让我们应用一个真值表:
left == true
right == false
遵循
!left == false
!right == true
遵循
!left && !right
false && true == false
是的,循环退出。