C#多线程开发2:线程挂起,恢复与中止等操作 |
您所在的位置:网站首页 › 线程挂起是什么意思 › C#多线程开发2:线程挂起,恢复与中止等操作 |
在博文《C#多线程开发1:使用Thread类创建与启动线程》中介绍了线程的创建与启动。本文将在前文的基础之上,接着介绍线程的挂起,恢复与中止等操作。 首先回忆一下前文的知识点。 我们已经学习到: 1、创建线程 ThreadStart entry = new ThreadStart(CalcSum); Thread workThread = new Thread(entry);或者 Thread workThread = new Thread(new ThreadStart(CalcSum));线程入口方法: static void CalcSum() { //do what you want }2、启动线程 workThread.Start();接下来,我们来研究线程的其他操作。 此文所用实例是在前文实例的基础上做一点小变动而得到的。 一开始,给出前文的完整实例代码及运行结果(以供整体把握实例操作)。 using System; using System.Threading; namespace ThreadExample { class Program { static void Main(string[] args) { ThreadStart entry = new ThreadStart(CalcSum); Thread workThread = new Thread(entry); workThread.Start(); CalcGap(); } static void CalcSum() { long sum = 0; for (long i = 0; i < 1000000000; i++) { sum += i; if (i % 100000000 == 0 && i!=0) { Console.WriteLine("workThread-->i={0}:sum={1}",i,sum); } } } static void CalcGap() { long gap = 0; for (long i = 1000000000; i >=0 ; i--) { gap = i-1; if (i % 100000000 == 0 && i != 0) { Console.WriteLine("MainThread-->i={0}:gap={1}", i, gap); } } } } }运行结果: 实例中,存在两个线程,主线程(Main函数)和工作线程(workThread线程),主线程完成求差操作,工作线程完成求和操作。两个线程同时运行。
3、挂起线程 挂起线程使用Suspend()方法。 线程被挂起后,操作被停止或进入休眠状态。 被挂起的线程不占用任何处理器时间。 修改前文实例代码,修改部分如下: ThreadStart entry = new ThreadStart(CalcSum); Thread workThread = new Thread(entry); workThread.Start(); workThread.Suspend();//挂起线程(改动部分) CalcGap();再次执行程序,得到如下结果: 从结果中可以看出,此时主线程正常执行,但是工作线程workThread没有被执行,因为工作线程一启动后就被挂起了,所以不会被执行。那么要想工作线程能继续执行,就需要恢复线程了。
4、恢复线程 线程恢复使用Resume()方法。 再次修改代码。 Thread workThread = new Thread(new ThreadStart(CalcSum)); workThread.Start(); workThread.Suspend();//挂起线程(改动部分) CalcGap(); workThread.Resume();//恢复线程(改动部分)上面的代码,在主线程执行完后,恢复被挂起的工作线程,执行结果如下。 对于这个结果,我们是可以预见的。
5、中止线程 中止线程使用Abort()方法。 线程被中止,就停止运行,是无法恢复的,因为Windows会永久地删除被中止线程的所有数据。 再次修改代码。 Thread workThread = new Thread(new ThreadStart(CalcSum)); workThread.Start(); workThread.Abort();//中止线程(改动部分) CalcGap();执行结果如下: 跟挂起工作线程时的结果一样,中止工作线程后,工作线程自然不会被执行。 我们自作聪明一把,尝试着去恢复被中止的线程,看看会有什么样的结果? 修改代码: Thread workThread = new Thread(new ThreadStart(CalcSum)); workThread.Start(); workThread.Abort(); CalcGap(); workThread.Resume();//改动代码运行程序,出现运行时错误,提示: 线程目前未运行;无法使其继续。 这点可以理解。
6、使线程休眠 使线程休眠使用Sleep()方法(看着就想睡觉)。 我们还可以使线程休眠一定的时间,累了就让他歇歇再工作。 示例代码如下: Thread workThread = new Thread(new ThreadStart(CalcSum)); workThread.Start(); Thread.Sleep(10000);//修改代码 CalcGap();执行结果: 从结果可以看出,主线程会被暂停一段时间后再接着运行,因为他去睡觉去了,睡了多久,睡了10000ms。休眠线程无需恢复,到指定时间会自动执行,他是不会睡到自然醒的哦。
7.Join()方法等待线程中止 如果后续的处理依赖于另一个已经终止的线程,可以调用Join()方法,等待线程中止。 修改代码: Thread workThread = new Thread(new ThreadStart(CalcSum)); workThread.Start(); workThread.Join();//等待工作线程中止(修改代码) CalcGap();运行结果: 工作线程调用了Jion()方法,需待工作线程中止后,主线程才会被执行。 Jion()的其他重载方法可以指定等待的时间期限,超过了这个时间期限,程序也会继续执行。 示例代码: Thread workThread = new Thread(new ThreadStart(CalcSum)); workThread.Start(); workThread.Join(10000);//修改代码 CalcGap();结果: 主线程会等待一段时间(10000ms),若这段时间内工作线程没挂掉,一旦超过这个时间,主线程便会开始工作。 Ok,就到这里了。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |