上图的所有多线程案例大全完整版本项目源代码下载---->点击下载
在讨论多线程阻塞的优点之前,我们需要明确什么是多线程阻塞。在多线程编程中,阻塞是一种机制,它允许一个线程在某些条件未满足之前暂停执行,直到这些条件满足后才继续执行。C# 提供了多种同步原语来实现线程阻塞
优点
-
简化同步逻辑:阻塞机制能够简化多线程之间的同步逻辑。当一个线程需要等待某个条件满足(如资源可用、任务完成或其他线程的信号)时,直接阻塞等待而非采用复杂的轮询或忙等待,可以减少代码复杂度,提高可维护性。
-
节省系统资源:相较于忙等待(即不断检查条件是否满足),阻塞线程会释放CPU资源,让给其他线程或进程使用,从而提升系统整体效率。当线程处于阻塞状态时,操作系统可以调度其他任务运行,避免不必要的CPU占用。
-
增强可靠性:阻塞同步机制有助于避免竞态条件和死锁,因为线程在关键资源不可用时会安全地等待,而不是试图强制访问,减少了数据不一致的风险。
-
提高响应性:在UI线程或服务端处理请求时,合理使用阻塞可以确保主线程不会被长时间占用,从而保持界面的流畅性或快速响应客户端请求。
业务应用场景
-
生产者-消费者模式:在这种模式下,生产者线程生成数据,消费者线程处理数据。使用阻塞机制可以确保生产者在消费者准备好之前不会生成数据,消费者也不会在没有数据时进行处理。
-
数据库访问:在需要对数据库进行并发访问的应用程序中,阻塞机制可以用来同步对数据库的访问,以避免数据冲突和保持数据的一致性。
-
I/O操作:在执行文件读写或其他I/O操作时,阻塞可以确保数据完全写入或读取后再进行后续操作,防止数据损坏。
-
信号处理:在需要等待外部信号(如用户输入、网络消息等)的应用程序中,阻塞可以确保程序在接收到信号后再继续执行。
-
任务调度:在需要按照特定顺序执行多个任务的场景中,阻塞可以用来控制任务的执行顺序,确保任务按正确的顺序完成。
-
资源共享:在多个线程需要访问共享资源(如内存、文件句柄等)时,阻塞可以确保资源在被一个线程使用时,其他线程不会进行访问。
-
超时控制:在需要对操作设置超时的场合,可以使用阻塞机制来实现超时控制,例如,当一个网络请求超过预定时间没有响应时,可以通过阻塞机制来终止等待。
static ManualResetEvent manualEvent = new ManualResetEvent(false);
private async void button25_Click(object sender, EventArgs e)
{
List<Task> taskList = new List<Task>();
taskList.Add(
Task.Run(() => {
ThreadWork();
})
);
taskList.Add(
Task.Run(() => {
ThreadWork();
})
);
Console.WriteLine("主线程等待一段时间后发送信号...");
Thread.Sleep(2000);
manualEvent.Set(); // 发送信号
Console.WriteLine("主线程继续执行其他任务...");
// 等待所有任务完成并获取结果
await Task.WhenAll(taskList);
Console.WriteLine("所有线程完成,程序结束。");
}
private void ThreadWork()
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} 开始等待信号...");
manualEvent.WaitOne(); // 等待信号
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} 收到信号,继续执行...");
Thread.Sleep(500);
}