標籤:使用者 generic 輸入 title false stat space 執行 tab
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的區別