多線程中測試某個條件的變化用 if 還是用 while?
阿新 • • 發佈:2017-08-04
lis 數據 如果 個數 邏輯 index 線程 簡單的 循環
以前一直不明白 當在線程的run()方法中需要測試某個條件時,為什麽用while,而不用if,直到看到了這個簡單的例子,終於明白了。。。。
這個例子是這樣的:
有兩個線程從List中刪除數據,而只有一個線程向List中添加數據。初始時,List為空,只有往List中添加了數據之後,才能刪除List中的數據。添加數據的線程向List添加完數據後,調用notifyAll(),喚醒了兩個刪除線程,但是它只添加了一個數據,而現在有兩個喚醒的刪除線程,這時怎麽辦??
如果用 if 測試List中的數據的個數,則會出現IndexOutofBoundException,越界異常。原因是,List中只有一個數據,第一個刪除線程把數據刪除後,第二個線程再去執行刪除操作時,刪除失敗,從而拋出 IndexOutofBoundException。
但是如果用while 測試List中數據的個數,則不會出現越界異常!!!神奇。
當wait等待的條件發生變化時,會造成程序的邏輯混亂---即,List中沒有數據了,再還是有線程去執行刪除數據的操作。因此,需要用while循環來判斷條件的變化,而不是用if。
多線程中測試某個條件的變化用 if 還是用 while?