C#多线程详解(一) Thread.Join()的详解

article/2025/11/6 8:41:04

什么是进程?
当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。
而一个进程又是由多个线程所组成的。

什么是线程?
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的好处:
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。 

多线程的不利方面:
线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 
多线程需要协调和管理,所以需要CPU时间跟踪线程; 
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug;

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

 

 

示例: 

using System;

using System.Threading;

namespace Test
{
    class TestThread
    {
        private static void FirstThreadFun()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "   i =  " + i);
                
            }
            Console.WriteLine(Thread.CurrentThread.Name + " 执行完毕");
        }

        static void Main(string[] args)
        {
            //程序调用了Main()函数时,就起动了一个进程,同时也启动了一个线程[这个线程就是主线程].
            Thread.CurrentThread.Name = "MainThread";
              
            //创建第一个线程
            Thread firstThread = new Thread(new ThreadStart(TestThread.FirstThreadFun));
            //取名为 firstThread
            firstThread.Name = "firstThread";

            for (int z = 0; z < 20; z++)
            {
                if (z == 10)
                {
                    firstThread.Start();
                    firstThread.Join();
                }
                else
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "   z =  " + z);
                }
            }
            Console.Read();
        }
    }

}

运行结果:

 

 

总结:

1.任何程序在执行时,至少有一个主线程。 

2.firstThread.Start()启动了一个线程后,用firstThread.Join()这个方法加入一个线程[即:暂停了主线程的运行],那么操作系统就会马上执行这个新加入的线程

3.Join 就是加入的意思,也就是说新创建的线程加入到进程中,并马上执行

4.如果只是 firstThread.Start(),把 firstThread.Join()方法注释掉会是什么结果?

下面的图是运行结果:

 

从运行结果可以看出:

1.如果只是 firstThread.Start(),注释掉 firstThread.Join()这个方法后,主线程并不会暂停[也就是说,firstThread 线程并不会马上执行]

2.所以要想一个线程在启动后就马上执行,必须调用 Thread.Join()方法. 

3.到这里,Thread.Join()这个方法的作用也就明显了:当调用了 Thread.Join()方法后,当前线程会立即被执行,其他所有的线程会被暂停执行.

当这个线程执行完后,其他线程才会继续执行.

 

我们通过其中提供的Thread类来创建和控制线程,ThreadPool类用于管理线程池等。
(此外还提供解决了线程执行安排,死锁,线程间通讯等实际问题的机制。)

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


http://chatgpt.dhexx.cn/article/vyj3QZUn.shtml

相关文章

1.java的协程_虚拟线程

盼过了春天盼秋天&#xff0c;从2017年到今天五年了&#xff0c;终于盼到loom转正了&#xff0c;当看到jdk19预览api的时候心情那个激动。。。期待已久的协程终于来临&#xff0c;再也不羡慕别人家的go孩子&#xff0c;咱终于可以理直气壮的说一句&#xff1a;咱也有&#xff0…

Kotlin协程到底是怎么切换线程的?你是否知晓?

好文推荐&#xff1a; 作者&#xff1a;RicardoMJiang 前言 之前对协程做了一个简单的介绍&#xff0c;回答了协程到底是什么的问题,感兴趣的同学可以了解下&#xff1a;【带着问题学】协程到底是什么? 通过上文&#xff0c;我们了解了以下内容 1.kotlin协程本质上对线程池的…

进程和线程、协程的区别

一、进程 进程是程序一次动态执行的过程&#xff0c;是程序运行的基本单位。每个进程都有自己的独立内存空间&#xff0c;不同进程通过进程间通信来通信。进程占据独立的内存&#xff0c;所以上下文进程间的切换开销&#xff08;栈、寄存器、页表、文件句柄等&#xff09;比较…

进程、线程与协程的比较

进程、线程和协程是三个在多任务处理中常听到的概念&#xff0c;三者各有区别又相互联系。 一、并行和并发 在介绍进程、线程和协程这三个概念之前&#xff0c;有两个操作系统中的相关概念需要简单解释一下&#xff1a;并行和并发。 并行&#xff1a;指多个任务同时执行。 并…

进程、线程、协程

进程、线程、协程 一、概念与区分 1、进程 进程是程序一次动态执行的过程&#xff0c;是程序运行的基本单位。每个进程都有自己的独立内存空间&#xff0c;不同进程通过进程间通信来通信。进程占据独立的内存&#xff0c;所以上下文进程间的切换开销&#xff08;栈、寄存器、…

终于明白:有了线程,为什么还要有协程?

并发的发展历史 其实&#xff0c;在早期计算机并没有包含操作系统&#xff0c;这个时候&#xff0c;这个计算机只跑一个程序&#xff0c;这个程序独享计算机的所有资源&#xff0c;这个时候不存在什么并发问题&#xff0c;但是对计算机的资源来说&#xff0c;确实是一种浪费。…

Java中的多线程(线程间通信)

/学习笔记/ 线程间通信&#xff1a; 多个线程在处理同一资源&#xff0c;但是任务却不同。 先看一个例子&#xff0c;采用两个线程执行进行输入和输出任务&#xff1a; //资源class Resource{String name;String sex;}//输入class Input implements Runnable{Resource r ;// …

协程和线程的区别、协程原理与优缺点分析、在Java中使用协程

文章目录 什么是协程协程的优点与缺点协程实现原理.协程与线程在不同编程语言的实现在Java中使用协程Kilim介绍Kilim整合Java,使用举例 小总结 什么是协程 相对于协程&#xff0c;你可能对进程和线程更为熟悉。进程一般代表一个应用服务&#xff0c;在一个应用服务中可以创建多…

进程、线程和协程之间的区别和联系

文章目录 一、进程二、线程三、进程和线程的区别与联系四、一个形象的例子解释进程和线程的区别五、进程/线程之间的亲缘性六、协程 一、进程 进程&#xff0c;直观点说&#xff0c;保存在硬盘上的程序运行以后&#xff0c;会在内存空间里形成一个独立的内存体&#xff0c;这个…

简单了解线程和协程(C#)

1.为什么需要线程和协程&#xff1a; &#xff08;1&#xff09;使程序中的任务可以并发执行&#xff0c;让程序同时处理多个任务&#xff0c;提高程序的运行效率和响应速度 &#xff08;2&#xff09;线程和协程可以共享同一个进程的资源&#xff0c;避免多个进程之间的资源浪…

线程与协程

线程与协程 概念进程【进程间通信&#xff08;IPC&#xff09;】 线程协程 区别场景计算密集型IO密集型两种操作如何优化哪些语言对多协程的支持 概念 进程 二进制可执行文件在计算机内存里的一个运行实例。比如.exe文件是个类&#xff0c;进程就是new出来的那个实例&#xf…

总结:协程与线程

一、介绍 本文主要梳理下进程&#xff0c;线程&#xff0c;协程的概念、区别以及使用场景的选择。 二、进程 我们知道&#xff0c;一切的软件都是跑在操作系统上&#xff0c;真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程&#xff0c;知道一个程序运行完…

Java线程协程

目录 线程的实现&#xff08;OS&&JVM&#xff09; 1.内核线程实现 2.用户线程实现 3.混合实现 4.Java线程的实现 ——如何实现不受Java虚拟机规范的约束 Java线程调度——系统自动完成&#xff08;可能被干预&#xff09; Java线程状态转换 内核线程的局限 协…

CDH6.3.2安装文档

正式安装之前&#xff0c;先说明一下CDH是基于Apache Hadoop及相关项目的发行版。CDH通过WEB界面管理&#xff0c;并提供了hadoop的两个核心功能&#xff1a;可扩展存储和分布式计算&#xff0c;以及企业级的重要功能。CDH是遵循Apache-licensed的开源软件&#xff0c;提供了基…

CDH数仓项目(一) —— CDH安装部署搭建详细流程

0 说明 本文以CDH搭建数据仓库&#xff0c;基于三台阿里云服务器从零开始搭建CDH集群&#xff0c;节点配置信息如下&#xff1a; 节点内存安装服务角色chen10216Gcloudera-scm-serverchen1038Gcloudera-scm-agentchen1048Gcloudera-scm-agent 上传需要用到的安装包&#xff…

CDH5.8安装说明

#CDH5.8安装说明 (Hadoop) 使用过Ambari&#xff0c;不知道是因为没有商业运作支撑还是社区活跃度有限&#xff0c;总体管理能力只能算凑合。很多Hadoop组件版本都不高&#xff0c;Spark也才1.3.X&#xff0c;Sqoop还是1.4.6.2.3&#xff0c;相对版本都比较低&#xff0c;而且…

大数据CDH安装详细教程

1.环境准备 1.1 服务器配置(理想配置) 1.2 修改主机名和hosts文件(所有节点) [roothadoop001 ~]# vim /etc/hosts vim /etc/hostname1.3 关闭防火墙 systemctl stop firewalld systemctl disable firewalld1.4 SSH免密登录(主节点) ssh-keygen -t rsa #分发到所有节点 ssh…

CDH6安装

官方文档 https://www.cloudera.com/documentation/enterprise/6/6.0/topics/installation.html 安装之前 JDK兼容性在不同的Cloudera Manager和CDH版本中也有所不同。某些版本的CDH 5与JDK 7和JDK 8兼容。在这种情况下&#xff0c;请确保所有服务都部署在同一主要版本上。例…

Cloudera(CDH) 简介和在线安装

实验背景 笔者需要维护线上的hadoop集群环境&#xff0c;考虑在本地搭建一套类似的hadoop集群&#xff0c;便于维护与管理。 Cloudera 简介 经过搜索发现Cloudera产品很适合笔者当前需求&#xff0c;于是开始研究Cloudera&#xff08;CDH&#xff09;的安装与使用&#xff0c;参…

CDH6.3.1安装

CDH6.3.1安装遇到很多问题&#xff0c;我想主要是由于条件有限&#xff0c;毕竟自己的电脑内存不如专业集群的内存大&#xff08;如果是内存和硬盘充足&#xff0c;有些是可以避免的&#xff0c;甚至不会出现报错的情况&#xff09;&#xff0c;这里就介绍一下我用VMware安装的…