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

相关文章

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE