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

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

C#中的 StreamReader/StreamWriter 使用示例详解

《C#中的StreamReader/StreamWriter使用示例详解》在C#开发中,StreamReader和StreamWriter是处理文本文件的核心类,属于System.IO命名空间,本... 目录前言一、什么是 StreamReader 和 StreamWriter?1. 定义2. 特点3. 用

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage