即使条件是未填充的Java多线程,也会结束

时间:2017-10-19 17:29:04

标签: java multithreading while-loop

我桌子周围有4个人,每个人之间都有一个工具。它们是4个独立的线程,它们的运行方法告诉它们在左右两侧选择工具并进食,然后将两个工具放回到桌面上,这样其他人也可以吃掉并再次完成。

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,则返回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;
           }
   }

3 个答案:

答案 0 :(得分:3)

这句话是真还是假,“两加二是五而我不是秃头”。无论我头上有多少头发,这种说法都是错误的。只有AND的双方都满意,并且只有一个是。

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

同样,如果left != true为false,则无论right的值是多少,这都是错误的。

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

仅当条件为真时才继续循环,如果left != true为假,则条件不为真。因此,如果lefttrue,则会停止,无论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

是的,循环退出。