【轉載】C# sleep 和wait的區別
阿新 • • 發佈:2017-12-01
通知 sdn 代碼 blog tool ogr rul smart abs
eep和wait都是使線程暫時停止執行的方法,但它們有很大的不同。
1. sleep是線程類Thread 的方法,它是使當前線程暫時睡眠,可以放在任何位置。
而wait,它是使當前線程暫時放棄對象的使用權進行等待,必須放在同步方法或同步塊裏。
2.Sleep使用的時候,線程並不會放棄對象的使用權,即不會釋放對象鎖,所以在同步方法或同步塊中使用sleep,一個線程訪問時,其他的線程也是無法訪問的。
而wait是會釋放對象鎖的,就是當前線程放棄對象的使用權,讓其他的線程可以訪問。
3.線程執行wait方法時,需要其他線程調用Monitor.Pulse()或者Monitor.PulseAll()進行喚醒或者說是通知等待的隊列。
而sleep只是暫時休眠一定時間,時間到了之後,自動恢復運行,不需另外的線程喚醒.
參考代碼:
using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static readonly object _locker = new object(); static bool _go; static void Main(string[] args) { new Thread(Work).Start(); //新線程會被阻塞,因為_go == false Console.ReadLine(); //等待用戶輸入 lock (_locker) { _go = true; //改變阻塞條件 Monitor.Pulse(_locker); //通知等待的隊列。 } Thread.Sleep(1000); } static void Work() { lock (_locker) { while (!_go) //只要_go字段是false,就等待。 Monitor.Wait(_locker); //在等待的時候,鎖已經被釋放了。 } Console.WriteLine("被喚醒了"); } } }
【轉自】http://blog.csdn.net/zhuoyue008/article/details/53382194
【轉載】C# sleep 和wait的區別