当线程调用Sleep()方法后,会进入壅闭状态(Blocked),在指定的时间内,该线程不会参与 CPU 的调理,也不会执行任何代码。当就寝的时间结束后,线程会从壅闭状态变化为就绪状态(Ready),等待 CPU 分配时间片来继续执行。比方,在一个游戏开发中,我们需要控制某个动画的播放速度,假设每帧动画需要停息 50 毫秒,代码如下:
using System;
using System.Threading;
class Animation
{
public void Play()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("播放第 " + (i + 1) + " 帧动画");
Thread.Sleep(50);
}
}
}
class Program
{
static void Main()
{
Animation animation = new Animation();
new Thread(animation.Play).Start();
}
}
复制代码
在这个例子中,每播放一帧动画,线程就会调用Thread.Sleep(50)进入壅闭状态 50 毫秒,50 毫秒后进入就绪状态,等待 CPU 分配时间片继续播放下一帧。
而线程调用Wait()方法后,会进入等待状态(Waiting),并且释放持有的锁。此时,该线程会被放入对象的等待队列中,直到被其他线程通过Notify()或NotifyAll()方法唤醒。唤醒后,线程会从等待状态变化为就绪状态,竞争锁资源,获取到锁后才会继续执行。比方,在一个多线程协作的文件处置惩罚系统中,假设有一个主线程负责读取文件内容,一个辅助线程负责对读取的内容举行解析,代码如下:
using System;
using System.IO;
using System.Threading;
class FileProcessor
{
private object lockObject = new object();
private string fileContent;
private bool isContentReady = false;
public void ReadFile(string filePath)
{
lock (lockObject)
{
using (StreamReader reader = new StreamReader(filePath))
{
fileContent = reader.ReadToEnd();
}
isContentReady = true;
Console.WriteLine("文件读取完成,通知解析线程");
Monitor.Pulse(lockObject);
}
}
public void ParseContent()
{
lock (lockObject)
{
while (!isContentReady)
{
Console.WriteLine("等待文件内容读取完成");
Monitor.Wait(lockObject);
}
Console.WriteLine("开始解析文件内容: " + fileContent);
}
}
}
class Program
{
static void Main()
{
FileProcessor processor = new FileProcessor();
new Thread(() => processor.ReadFile("test.txt")).Start();