首先,多線程中會使用到兩個延遲的函數,wait和sleep。
wait是Object類中的方法,而sleep是Thread類中的方法。
sleep是Thread類中的靜態方法。無論是在a線程中調用b的sleep方法,還是b線程中調用a的sleep方法,誰調用,誰睡覺。
最主要的是sleep方法調用之后,並沒有釋放鎖。使得線程仍然可以同步控制。sleep不會讓出系統資源;
而wait是進入線程等待池中等待,讓出系統資源。
調用wait方法的線程,不會自己喚醒,需要線程調用 notify / notifyAll 方法喚醒等待池中的所有線程,才會進入就緒隊列中等待系統分配資源。sleep方法會自動喚醒,如果時間不到,想要喚醒,可以使用interrupt方法強行打斷。
Thread.sleep(0) // 觸發操作系統立刻重新進行一次CPU競爭。
使用范圍:
sleep可以在任何地方使用。而wait,notify,notifyAll只能在同步控制方法或者同步控制塊中使用。
sleep必須捕獲異常,而wait,notify,notifyAll的不需要捕獲異常。
lock關鍵字可以用來確保代碼塊完成運行,而不會被其他線程中斷。它可以把一段代碼定義為互斥段(critical section),互斥段在一個時刻內只允許一個線程進入執行,而其他線程必須等待。這是通過在代碼塊運行期間為給定對象獲取互斥鎖來實現的。例如下面增加任務時候就要用上lock函數。
public void AddTask(List<DataHour> datas) { if (datas != null && datas.Count > 0) { lock (_taskQueueLock) { for (int i = 0; i < datas.Count; i++) { datas[i].Iaqi = GetIaqi(datas[i]); } _taskQueue.Enqueue(datas); } } }