多线程编程(2)
2010-11-16 11:32 Clingingboy 阅读(736) 评论(2) 编辑 收藏 举报线程自身阻塞
线程由于某些原因,可以停下一段时间即调用Sleep方法
妈妈给女儿削梨(Join)
1.妈妈削梨(thread1)
2.女儿吃梨(thread2)
必须先妈妈削梨,然后女儿才可以吃梨.即女儿在等待妈妈削梨这个动作结束,否则的话则停止吃梨.即线程2是依赖于线程1的.如下代码
此处调用了线程的Join方法,以等待该线程结束
public class Demo1 { private Thread thread2; private Thread thread1; public Demo1() { thread1 = new Thread(new ThreadStart(Task1)); thread2 = new Thread(new ThreadStart(Task2)); thread2.Start(); thread1.Start(); } public void Task1() { Console.WriteLine("削梨"); Console.WriteLine(DateTime.Now); Thread.Sleep(5000); } public void Task2() { thread1.Join(); Console.WriteLine(DateTime.Now); Console.WriteLine("吃梨"); } }
结果
Join有3个重载方法,如果线程1未结束,那么线程2那一直等待,可以设置一个时间,一直没反应的话则继续执行.
如果两个线程的任务是无关的,那么会运行的很好。一旦有了关系,则复杂度就出来了。
女儿改变想法不吃梨了(Interrupt)
如果妈妈削梨需要5分钟,而女儿只愿意等3分钟,3分钟过后就不要吃梨了,怪她娘削的太慢,然后让她娘别削了(做妈的真不容易)…
即线程2等了3分钟,若线程1还没完成任务,那么线程2就终止了线程1的操作
示例如下,Interrupt方法会中断处于WaitSleepJoin状态的线程,并抛出ThreadInterruptedException 异常
public void Task1() { Console.WriteLine("妈妈开始削梨"); try { Thread.Sleep(5000); } catch (ThreadInterruptedException e) { Console.WriteLine("妈妈停止削梨"); } } public void Task2() { var date1 = DateTime.Now; thread1.Join(3000); var date2 = DateTime.Now; if ((date2 - date1).TotalSeconds >= 3) { Console.WriteLine("女儿不吃梨了"); thread1.Interrupt(); } else { Console.WriteLine("吃梨"); } }

女儿突然不想吃梨了
上面的例子是考验耐性,
即线程在处于WaitSleepJoin的状态下,调用Interrupt来唤醒线程并中断
但妈妈是一直在削梨的,即这个线程是在做事的,不管梨有没削好,突然女儿就要吃梨了。。。即要将线程给中止掉.
示例如下
注意:这里线程2首先自身挂起3秒,跟线程1无关,其也不清楚线程1在干嘛,就是过了3秒突然想中止(Abort方法)线程1的任务
并非绝对的中止和中断:其是通过抛出异常来捕获中止和中断信息的,而非直接退出
public void Task1() { Console.WriteLine("妈妈开始削梨"); try { Thread.Sleep(5000); } catch (ThreadInterruptedException e) { Console.WriteLine("妈妈中断削梨"); } catch (ThreadAbortException e) { Console.WriteLine("妈妈中止削梨"); } } public void Task2() { Thread.Sleep(3000); Console.WriteLine("女儿不吃梨了");
thread1.Abort(); }
中止以后:
当妈妈收到中止削梨的信号时,线程本身内部还可以做一些善后处理。比如女儿不吃自己吃
当线程中止后,如果不调用ResetAbort方法,那么该线程catch之后的代码将无法继续执行.
如下示例
public void Task1() { Console.WriteLine("妈妈开始削梨"); try { Thread.Sleep(5000); } catch (ThreadInterruptedException e) { Console.WriteLine("妈妈中断削梨"); } catch (ThreadAbortException e) { Console.WriteLine("妈妈中止削梨"); Thread.ResetAbort(); } Console.WriteLine("妈妈自己吃"); }
结果如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现