C#中Sleep() 和 Wait()的區(qū)別小結(jié)
Sleep() 和 Wait() 是兩個(gè)不同的方法,用于控制線程的執(zhí)行。
Sleep() 方法:
是線程類 Thread 的靜態(tài)方法,它使當(dāng)前線程暫停執(zhí)行一段時(shí)間。
Sleep() 方法接受一個(gè)參數(shù),表示線程暫停的時(shí)間長(zhǎng)度,單位是毫秒。
在暫停期間,線程不會(huì)釋放鎖資源。當(dāng)暫停時(shí)間結(jié)束后,線程會(huì)重新進(jìn)入就緒狀態(tài),等待 CPU 調(diào)度執(zhí)行。
Sleep() 方法可以用于模擬一段時(shí)間的延遲操作。
Wait() 方法:
是 Object 類的實(shí)例方法,它使當(dāng)前線程進(jìn)入等待狀態(tài),直到其他線程調(diào)用相同對(duì)象的 Notify() 或 NotifyAll() 方法喚醒它。
Wait() 方法必須在同步代碼塊或同步方法中調(diào)用,并且會(huì)釋放鎖資源。當(dāng)線程被喚醒后,它會(huì)重新競(jìng)爭(zhēng)鎖資源,并繼續(xù)執(zhí)行。
Wait() 方法通常與Notify() 或 NotifyAll() 方法配合使用,用于實(shí)現(xiàn)線程間的協(xié)作。(Notify:通知)
參考代碼:
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(); //新線程會(huì)被阻塞,因?yàn)開(kāi)go == false Console.ReadLine(); //等待用戶輸入 lock (_locker) { _go = true; //改變阻塞條件 Monitor.Pulse(_locker); //通知等待的隊(duì)列。 } Thread.Sleep(1000); } static void Work() { lock (_locker) { while (!_go) //只要_go字段是false,就等待。 Monitor.Wait(_locker); //在等待的時(shí)候,鎖已經(jīng)被釋放了。 } Console.WriteLine("被喚醒了"); } } }
區(qū)別:
- Sleep() 是 Thread 線程類的方法,而 Wait() 是 Object 類的方法。
- Seep() 會(huì)暫停當(dāng)前線程的執(zhí)行一段時(shí)間,而 Wait() 會(huì)使當(dāng)前線程進(jìn)入等待狀態(tài)。
- Sleep() 不會(huì)釋放鎖資源,而 Wait() 會(huì)釋放鎖資源。
- Sleep() 不需要被其他線程喚醒,而 Wait() 需要被其他線程調(diào)用相同對(duì)象的 Notify() 或 NotifyAll() 方法喚醒。
需要注意的是,Sleep() 和 Wait() 方法都可能拋出 InterruptedException 異常,需要進(jìn)行異常處理。
到此這篇關(guān)于C#中Sleep() 和 Wait()的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)C# Sleep() Wait()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用C#調(diào)用系統(tǒng)API實(shí)現(xiàn)內(nèi)存注入的代碼
使用C#調(diào)用系統(tǒng)API實(shí)現(xiàn)內(nèi)存注入的代碼,學(xué)習(xí)c#的朋友可以參考下。2011-06-06使用Deflate算法對(duì)文件進(jìn)行壓縮與解壓縮的方法詳解
本篇文章是對(duì)使用Deflate算法對(duì)文件進(jìn)行壓縮和解壓縮的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06