0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

多线程启动停止暂停继续

微云疏影 来源:dotNet工控上位机 作者:dotNet工控上位机 2022-08-11 15:47 次阅读

前言

初学者学习编程时,很容易因为多线程出现各种问题,导致不敢使用多线程。但是多线程技术在做开发中,是不可忽视的一个技术,基本上我们实际应用中,每个项目都会使用多线程,所以多线程技术必须掌握。

为什么要用多线程

随着工业的进步,现在的笔记本、台式机大都是双核的,4核、8核甚至16核,也很常见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。

单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程”同时”运行罢了。

多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。

如果你做项目不使用多线程,不仅是技术的问题,也是对电脑资源的极大浪费,就像你买了一辆配置非常高的越野车,你仅仅只用它来日常代步一样。3

为什么不敢用多线程

之前跟一些学员沟通时发现,很多学员之所以不敢使用多线程,是因为之前出过问题,有种“一朝被蛇咬,十年怕井绳”的感觉。

为什么多线程容易出问题,有个主要的原因在于多线程充满着“未知性”,有的人使用时,发现代码并没有按照预想的流程在走,这其实是正常的。

我们必须要明确一点,多线程确实是“不可控的”,有某种意义上来说,多线程是靠CPU调度来执行的,并非人为去控制。

我们所谓的控制多线程,仅仅是.NET框架开放了一些接口开发者,这样可以相对性地间接控制多线程的启动停止暂停继续。

线程的启动停止

线程的启动停止,从.Net Framework 4.5开始,Task提供了一个叫CancellationTokenSource的对象,可以使用它来对多线程的启停进行控制。

首先,我们做一个线程任务,这个任务很简单,只是不断操作某个变量,每0.1秒加1,到一定值之后,重置为0,然后将这个值显示在界面上,界面如下所示:

多线程启动停止暂停继续

所以任务方法如下:

多线程启动停止暂停继续

个对象就是CancellationTokenSource的对象,因此我们需要创建一个CancellationTokenSource对象cts:

多线程启动停止暂停继续

然后在启动线程按钮的事件里,编写代码如下:

多线程启动停止暂停继续

停止线程按钮的事件里,只需要调用cts的Cancel方法即可:

多线程启动停止暂停继续

其实,说白了,就是通过cts来控制cts的IsCancellationRequested属性,进而实现多线程的控制。

线程的暂停继续

多线程的暂停继续,.NET为我们提供了另外一个对象——ManualResetEvent,这个对象会有一个值,这个值是布尔类型,就像一个门闸一样,True是打开门闸,False是关闭门闸,所以想要暂停多线程就调用这个对象的Reset方法,想要继续多线程就调用这个对象的Set方法,使用非常简单。

首先我们创建一下这个对象,可以通过构造方法,给这个对象赋初始值,我这里为True,这样就能直接运行,不会阻塞。

多线程启动停止暂停继续

但是如果希望这个对象与多线程有所联系,必须要在多线程的方法里体现这个对象的作用,这个是调用这个对象的WaitOne方法,表示在调用的地方阻塞住,通过判断True或者False来决定是否继续执行,就像大家开车过高速收费站一样,即使现在普遍采用ETC了,在入口也需要减速,有一个ETC识别的过程,识别成功才会抬杆,识别识别,杆子是不会自动抬起的,这个是一样的道理。

所以线程执行代码如下:

多线程启动停止暂停继续

对比一下,其实就是加了一个manual.WaitOne()。

线程暂停代码:

多线程启动停止暂停继续

线程继续代码:

多线程启动停止暂停继续

AutoResetEvent

AutoResetEvent和ManualResetEvent的用法非常相似,区别在于一个是手动,一个是自动,AutoResetEvent会在置位之后自动复位,这样体现在多线程里,就是会只执行一次,就像大家进小区一样,如果有10辆车在排队,这时候如果自动模式,每次只能进一辆车,如果是手动模式,可以由保安控制门闸打开,等10辆车都进去之后,再由保安将门闸关注。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206546
  • 多线程
    +关注

    关注

    0

    文章

    271

    浏览量

    19724
  • 变量
    +关注

    关注

    0

    文章

    595

    浏览量

    28112
收藏 人收藏

    评论

    相关推荐

    Java多线程的用法

    本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程中同时运行多个线程,每个线程都可以独立执行不同的任务或操作。 与单线程
    的头像 发表于 09-30 17:07 620次阅读

    多线程编程之一: 问题提出

    多线程编程之一 问题提出编写一个耗时的单线程程序:  新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为
    发表于 10-22 11:41

    多线程程序,如何设置停止

    是这样的,我的程序是多线程的,前面板是4个独立的测试窗口,程序框图是4个while循环,我想在4个窗口都在等待开始测试时,可以停止整个程序,前面板只设定一个停止控件,哪位能提供下好的思路,谢谢了。
    发表于 10-20 11:39

    多线程解决思路一

    使用方法节点实现多线程,两个线程之间的数据传输也都使用方法节点的方式实现。1、初始化时打开另一个线程。2、程序运行过程中实现对被调线程的实施读写。3、Write data按下后写入对应
    发表于 07-06 17:21

    多线程在VC++串口通信程序中的应用

    本文通过一机房监控系统程序中串口通信对多线程的应用来介绍Windows 9X/NT操作系统中多线程的应用和VC++对多线程的支持。关健词: 多线程,串口通信在现代的各种实时监控系
    发表于 09-03 11:45 27次下载

    多线程与聊天室程序的创建

    多线程程序的编写,多线程应用中容易出现的问题。互斥对象的讲解,如何采用互斥对象来实现多线程的同步。如何利用命名互斥对象保证应用程序只有一个实例运行。应用多线程编写网络聊天室程序。
    发表于 05-16 15:22 0次下载

    多线程好还是单线程好?单线程多线程的区别 优缺点分析

    摘要:如今单线程多线程已经得到普遍运用,那么到底多线程好还是单线程好呢?单线程多线程的区别又
    发表于 12-08 09:33 8w次阅读

    什么是多线程编程?多线程编程基础知识

    摘要:多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程。本文主要以多线程编程以及多线程编程相关知识而做出的一些结论。
    发表于 12-08 16:30 1.2w次阅读

    Python3多线程核心知识

    用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来
    的头像 发表于 04-16 11:46 5081次阅读

    Linux下的多线程编程

    线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。  使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux
    发表于 04-02 14:43 474次阅读

    LabWindows CVI中的多线程技术的详细资料说明

    中,应用程序可以随 时被暂停。使用多线 程技术,应用程序可 以把它的任务分配到 单独的线程中执行。 在多线程程序中,操 作系统让一个线程的 代码执行一段时间(被称为时间片) 后,会切换
    发表于 10-15 17:24 25次下载

    Java多线程永动任务 多线程异步任务项目解读

    1. 功能说明 2. 多线程任务示例 2.1 线程池 2.2 单个任务 2.3 任务入口 2.4 结果分析 2.5 源码地址 3. 写在最后 大家好,今天教大家撸一个 Java 的多线程永动任务
    的头像 发表于 10-19 11:46 789次阅读

    SpringBoot实现多线程

    SpringBoot实现多线程
    的头像 发表于 01-12 16:59 1292次阅读
    SpringBoot实现<b class='flag-5'>多线程</b>

    Linux中多线程编程的知识点

    Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux中多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。
    发表于 04-26 17:27 479次阅读
    Linux中<b class='flag-5'>多线程</b>编程的知识点

    labview AMC多线程

    labview_AMC多线程
    发表于 08-21 10:31 23次下载