2017-01-24 31 views
-1

在什麼情況下會發生這種情況?什麼circmustances可以導致一個線程從等待隊列轉移到阻塞的隊列?

據我知道

阻止隊列是線程產生對象和消費對象之間的緩衝區。

等待隊列阻止線程競爭同一個鎖。

因此線程獲得一個鎖,但無法傳遞給消費者,因爲它現在忙?

+1

這兩件事情彼此沒有關係。 'BlockingQueues'包含對象,而不是線程。線程從隊列中讀取和寫入,它們不會被「傳送」給它。 – Kayaman

+2

[WAIT和BLOCKED線程狀態之間的區別]可能的重複(http://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states) –

+0

您應該檢查此問題:http:/ /stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states –

回答

1

問題使得假設下,只可意會,它其實就是「什麼情況下可以從wait狀態導致線程變化blocked狀態?」

有可能是一個特定的調度程序實現將這些線程維護在專用隊列中,必須在這些狀態更改時將線程從一個隊列移動到另一個隊列,並影響最初提出問題的人的思維集合,但是不應該用假定的實現細節加載這樣的問題。作爲一個方面說明,儘管線程隊列是有意義的,但我無法想象將blockedwaiting線程放入(全局)隊列的真正原因。

如果這是問題的初衷,那麼不應該將其與實現隊列的Java類以及具有相似名稱的名稱混淆起來。

  • 線程是在blocked狀態,如果它試圖而另一個線程擁有該對象顯示器進入​​方法或代碼片段。從那裏,該線程將轉向runnable狀態,如果擁有者釋放顯示器和被阻塞的線程在獲取監視器成功

  • 線程是在waiting狀態,如果執行一個明確的動作,可以僅進行,如果另一線程執行相關的操作,即如果線程在對象上調用wait,則只能在另一個線程在同一對象上調用notify時才能繼續。如果線程調用LockSupport.park(),另一個線程必須將該線程作爲參數調用LockSupport.unpark()。當它在另一個線程上調用join時,該線程必須結束其執行以結束等待。 waiting狀態也可能由於中斷spuriuos喚醒而終止。

  • 作爲一種特殊情況,Java認爲線程處於timed_waiting狀態,如果他們調用上述超時或執行Thread.sleep的方法。此狀態僅與waiting狀態不同,因爲狀態也可能由於經過的時間而結束。

當一個線程的對象上調用wait,它必須擁有該對象的監視器,即是​​方法或代碼塊的內部。監視器在此呼叫時被釋放,並在返回時重新獲得。當它不能立即重新獲得時,線程將從waitingtimed_waiting狀態變爲blocked狀態。