首页 > 编程语言 >C#多线程学习(一) 多线程的相关概念

C#多线程学习(一) 多线程的相关概念

时间:2023-04-13 18:12:16浏览次数:38  
标签:CurrentThread Thread C# 程序 System 概念 线程 多线程

C#多线程学习(一) 多线程的相关概念

什么是进程?

当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。

而一个进程又是由多个线程所组成的。

什么是线程?

线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),

但代码区是共享的,即不同的线程可以执行同样的函数。

什么是多线程?

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行

不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的好处:

可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它

的线程而不是等待,这样就大大提高了程序的效率。

多线程的不利方面:

线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;

多线程需要协调和管理,所以需要CPU时间跟踪线程;

线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;

线程太多会导致控制太复杂,最终可能造成很多Bug;

接下来将对C#编程中的多线程机制进行探讨。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停下来,以便看清楚执行过程中的输出。

任何程序在执行时,至少有一个主线程。
一个直观印象的线程示例:

//SystemThread.cs
using System;
using System.Threading;
namespace ThreadTest
{
	class RunIt
	{
	[STAThread]
	static void Main(string[] args)
	{
		Thread.CurrentThread.Name="System Thread";//给当前线程起名为"System Thread"
		Console.WriteLine(Thread.CurrentThread.Name+"Status:"+Thread.CurrentThread.ThreadState);
		Console.ReadLine();
	}
	}
}

输出如下:

System Thread's Status:Running

在这里,我们通过Thread类的静态属性CurrentThread获取了当前执行的线程,对其Name属性赋值“System Thread”,最后还输出了它的当前状态(ThreadState)。
所谓静态属性,就是这个类所有对象所公有的属性,不管你创建了多少个这个类的实例,但是类的静态属性在内存中只有一个。很容易理解CurrentThread为什么是静态的——虽然有多个线程同时存在,但是在某一个时刻,CPU只能执行其中一个。
在程序的头部,我们使用了如下命名空间:
using System;
using System.Threading;
.net framework class library中,所有与多线程机制应用相关的类都是放在System.Threading命名空间中的。如果你想在你的应用程序中使用多线程,就必须包含这个类。
我们通过其中提供的Thread类来创建和控制线程,ThreadPool类用于管理线程池等。(此外还提供解决了线程执行安排,死锁,线程间通讯等实际问题的机制。)

Thread类有几个至关重要的方法,描述如下:

Start():启动线程;
Sleep(int):静态方法,暂停当前线程指定的毫秒数;
Abort():通常使用该方法来终止一个线程;
Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复;
Resume():恢复被Suspend()方法挂起的线程的执行;

标签:CurrentThread,Thread,C#,程序,System,概念,线程,多线程
From: https://www.cnblogs.com/x-zhi/p/17315309.html

相关文章

  • 当 Amazon Lambda 遇上 Apache APISIX 可以擦出什么火花?
    本文首先介绍了什么是Serverless,以及为什么需要Serverless;其次,讲述了一个好的网关在Serverless架构下的重要性,而APISIX就是这样的一个网关;最后,本文重点介绍了APISIX中的Serverless类型的插件aws-lambda,同时列举了ApacheAPISIX其它Serverless相关插件。作者程小......
  • ChatGPT吃我饭,还要掀我碗
    ChatGPT面世,各种被AI取代“失业言论”笼罩在人们头顶,本文聚焦这一问题,推荐关注ChatGPT的小伙伴阅读。一时间火爆全网的新晋网红——ChatGPT,就问:还有谁不认识?谷歌计划在旗舰搜索引擎中添加对话式人工智能功能,谷歌首席执行官SundarPichai在采访中还表示:AI并不会对谷歌的搜索业......
  • 便捷高效,Notion AI比ChatGPT更加香
    在去年11月底,ChatGPT横空出世,爆火全球,此时在硅谷拥有百亿估值的生产力软件独角兽Notion也悄悄推出了其AI服务,并向用户开放了预约。排队人数一度超出200万之多,不久前Notion宣布全面开放其AI产品服务,这意味着每个用户现在都可以随时在自己的Notion页面上调用AI功能。瞬间各种场景开......
  • 如何用ChatGPT做设计?激发设计师们的灵感
    伴随着人工智能技术的迅猛发展,AI工具在设计领域中的应用也越来越广泛。当前,诸如ChatGPT等AI工具不仅可以进行自然语言处理,还可以应用于图像、视频等多种媒体领域,为设计师们提供了丰富的应用场景。使用Chatgpt:1、打开多御浏览器。2、在多御浏览器首页,找到【ChatGPT】。提供灵感和......
  • 【Java技术专题】「盲点追踪」突破知识盲点分析Java安全管理器(SecurityManager)
    前提介绍Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性;二是Java语言开发的应用程序的安全性。由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我们考虑。其中第二个安全性是我们重点考虑的问题,一般我们可以通过安全管理器机制来完善安全性,安全管......
  • Spring IOC容器注解大全—基于Java的容器配置
    本节介绍了如何在你的Java代码中使用注解来配置Spring容器。它包括以下主题。基本概念:@Bean 和 @Configuration通过使用 AnnotationConfigApplicationContext 实例化Spring容器使用 @Bean 注解使用 @Configuration 注解构建基于Java的配置Bean定义配置PropertySource 抽象......
  • Containerd ctr、crictl、nerdctl 客户端命令
    转载自:https://blog.laeni.cn/note/cloud/cri/ctl/由于Containerd已经从Docker独立,这代表Docker底层也是使用的是Containerd。而Containerd是实现了CRI规范的,所以k8s是可以直接使用Containerd而无需再使用Docker的。但是大部分时候我们还是使用Docker作为k8s......
  • 使用vue+bpmn-js实现activiti的流程设计器__Vue.js
    https://www.vue-js.com/topic/5f6c4af84590fe0031e591ef完整代码见github:https://github.com/griabcrh/vue-activiti-demo适配activitiimportactivitiModdleDescriptorfrom'../js/activiti.json';this.bpmnModeler=newBpmnModeler({container:ca......
  • React国际化方案及示例
    ​背景:随着公司走向国际,那么需要对产品进行国际化语言的预言处理。该预言方案主要是为了满足跨国企业和全球用户的需求而设计的。随着公司步入国际领域,该方案将有助于提高公司的国际化水平和竞争力。在国际化项目中,需要考虑不同语言、文化和地区的用户习惯和需求,确保产品的功能和......
  • Mac 的anaconda终端不一致解决
    9、Mac的anaconda终端不一致解决使用pycharm创建virtualenv环境后,命令行和终端的代码解释器不一致/usr/bin/python3是系统自带的Python3解释器问:但是为什么pycharm在这里要让我选择一个baseinterpreter解释器呢?virtualenv不是会创建一个新的虚拟环境解释器吗?为什么这......