2017-10-19 83 views
-2

我身邊有表4人,他們每個人之間是一個工具。他們是4個獨立的線程,他們的運行方法告訴他們選擇右側和左側的工具並進行吃飯,然後將兩個工具放回桌子,以便其他人也可以進食並再次完成所有工作。雖然結束,即使條件未填充的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是同步的,如果,如果有人有它在這一刻工具抓鬥是成功的,並返回false返回true。

我會很高興的任何幫助


編輯

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')而不是'var == true'或'var!= false',並使用'!var'而不是'var!= true'或'var == false'。 –

回答

1

你的條件意味着該循環應該繼續,而左右兩個都是假的,它停止一旦他們中任何一個真正。您應該試試while((left != true) || (right != true)),這意味着只有兩者都爲真時循環纔會停止。

+0

爲什麼?你改變了什麼? *爲什麼*你改變了它?代碼轉儲不是有用的*答案。 *(不是我的DV)* –

+0

這工作,問題是在條件和你是對的...謝謝你的幫助:) –

-1

首先,讓我們簡化一下:

while (!left && !right) { 

現在,讓我們應用真值表:

left == true 
right == false 

它遵循

!left == false 
!right == true 

它遵循

!left && !right 
false && true == false 

是的,循環退出。

+0

嗯? '!left &&!right = false && true = false'?賦值運算符? – Andreas

3

這句話是真是假,「兩加二是五,我不禿頭」。無論頭上有多少頭髮,這句話都是錯誤的。只有AND的雙方都滿意並且只有一個是真的。

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

同樣,如果left != true是假的,不管right值這是假的。

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

僅當條件爲真時才繼續循環,如果left != true爲假,則條件不成立。因此,如果lefttrue,它將停止,無論right的值如何。

未來,不要做像left != true這樣的事情。由於left已經是一個真或假的布爾值,所以不需要將其與布爾值進行比較。如果您想反轉,請使用!left

更簡單,正確,辦法做到這一點是:當left && right是真正的大功告成

while (! (left && right)) 

。所以你想保持循環,而事實並非如此。

+0

謝謝,你的建議也可以發揮作用:)問題真的存在於條件本身。 –