C#多线程开发2:线程挂起,恢复与中止等操作

2024-04-02 19:38

本文主要是介绍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,就到这里了。

这篇关于C#多线程开发2:线程挂起,恢复与中止等操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/870876

相关文章

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输