【程序&執行緒】睡眠與喚醒
阿新 • • 發佈:2019-02-19
無法進入臨界區的時候選擇阻塞而不是忙等待。有sleep和wakeup兩個方法。
訊號量semaphore
up和down兩種操作。down做減一操作,如果訊號量大於0就減一,不然就睡眠執行緒。關鍵在於原子操作,所以一般是在系統層面的。 首先兩個程序同時執行。當A程序想進入臨界區的時候執行down操作來做標記,把一般訊號量和mutex(互斥鎖)都down一遍,這個時候如果訊號量小於等於0,則其他程序沒辦法再進入臨界區(會被系統方法阻塞)直至訊號量重新大於零。這種就可以解決生產者-消費者模型了,可以保證倉庫裡的貨物一定是大於零的,可以被消費的,而mutex訊號量則用來鎖住倉庫。 互斥量mutex 條件變數condition 考慮生產者消費者模型,當倉庫滿的時候生產者需要阻塞。當倉庫又有空位的時候需要有人告訴生產者脫離阻塞,這就是條件變數要做的事。
管程monitor 在java中就是sychronized塊,只能由某個執行緒執行。 ==============================================Java================================================ Java中的同步 首先了解notify和wait。這兩個是Object的方法,不屬於Thread。 在一個while true迴圈裡使用這個。當不符合條件的時候,使用wait來讓所有使用該object的執行緒阻塞,當符合條件的時候,使用notifyAll來放行。 在sychronized塊裡面使用wait以及notify,否則虛擬機器會生成IllegalMonitorStateException。
Java中的中斷
stop方法已經廢棄,強制退出容易引起各種狀態問題。由於執行緒不同於程序,採取的是協作機制,而非競爭機制,所以採用更加和平的“通知”方式。當用戶想要停止某個執行緒的時候,就會向它發一個interrupt()方法,這個方法會設定Thread裡面的標識位。這個執行緒會在合適的時機呼叫isInterrupted()來判斷標誌位,並在自己覺得可以的時候退出(在這之前做一些手尾工作,回退狀態,回退操作etc.)(當然它也可以無視這個標識位)。
退出的方式是丟擲一個InterruptedException。
public static boolean interrupted
一個靜態方法,由執行緒呼叫的時候會檢測當前執行緒是否被中斷標識,並且清除中斷位。
=====================================================Java=====================================================
訊息傳遞
ab執行緒都在loop中。當a覺得b可以處理事情的時候,傳送一條訊息給b,b隨即從loop中拿到訊息並開始處理事情。
屏障 barrier
只有當所有程序都到達某個條件的時候,才開放屏障,所有執行緒允許進入下一個階段。
up和down兩種操作。down做減一操作,如果訊號量大於0就減一,不然就睡眠執行緒。關鍵在於原子操作,所以一般是在系統層面的。 首先兩個程序同時執行。當A程序想進入臨界區的時候執行down操作來做標記,把一般訊號量和mutex(互斥鎖)都down一遍,這個時候如果訊號量小於等於0,則其他程序沒辦法再進入臨界區(會被系統方法阻塞)直至訊號量重新大於零。這種就可以解決生產者-消費者模型了,可以保證倉庫裡的貨物一定是大於零的,可以被消費的,而mutex訊號量則用來鎖住倉庫。 互斥量mutex 條件變數condition 考慮生產者消費者模型,當倉庫滿的時候生產者需要阻塞。當倉庫又有空位的時候需要有人告訴生產者脫離阻塞,這就是條件變數要做的事。
管程monitor 在java中就是sychronized塊,只能由某個執行緒執行。 ==============================================Java================================================ Java中的同步 首先了解notify和wait。這兩個是Object的方法,不屬於Thread。 在一個while true迴圈裡使用這個。當不符合條件的時候,使用wait來讓所有使用該object的執行緒阻塞,當符合條件的時候,使用notifyAll來放行。 在sychronized塊裡面使用wait以及notify,否則虛擬機器會生成IllegalMonitorStateException。