1. 程式人生 > >【轉載】C# sleep 和wait的區別

【轉載】C# sleep 和wait的區別

通知 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的區別