当前位置: 首页 > news >正文

c#中Thread.Join()方法的经典示例

在 C# 中,Thread.Join 是一个非常有用的方法,它可以让主线程(调用线程)等待子线程(被调用线程)执行完毕后再继续执行。

1、经典示例1

using System;
using System.Threading;public class Example
{static Thread thread1, thread2;public static void Main(){thread1 = new Thread(ThreadProc);thread1.Name = "Thread1";thread1.Start();thread2 = new Thread(ThreadProc);thread2.Name = "Thread2";thread2.Start();Console.ReadKey();}private static void ThreadProc(){Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);if (Thread.CurrentThread.Name == "Thread1" &&thread2.ThreadState != ThreadState.Unstarted){Console.WriteLine("thread2.Join");thread2.Join(); }Thread.Sleep(1000);Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);Console.WriteLine("Thread1: {0}", thread1.ThreadState);Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);}
}

运行结果


Current thread: Thread1
thread2.JoinCurrent thread: Thread2Current thread: Thread2
Thread1: WaitSleepJoin
Thread2: RunningCurrent thread: Thread1
Thread1: Running
Thread2: Stopped

这个例子演示了“Thread.Join 会阻塞调用线程,直到被调用线程完成执行”

2、经典示例2

using System.Threading;
using System;class TestThread
{private static void ThreadTst(){Console.WriteLine("  " + Thread.CurrentThread.Name + "   开始执行");for (int i = 0; i < 10; i++){Console.WriteLine("     " + Thread.CurrentThread.Name + "   i =  " + i);Thread.Sleep(10);}Console.WriteLine("  " + Thread.CurrentThread.Name + "   执行完毕");}static void Main(string[] args){//程序调用了Main()函数时,就起动了一个进程,同时也启动了一个线程[这个线程就是主线程].Thread.CurrentThread.Name = "MainThread";//创建第一个线程Thread tA = new Thread(new ThreadStart(TestThread.ThreadTst));tA.Name = "线程A";Thread tB = new Thread(new ThreadStart(TestThread.ThreadTst));tB.Name = "线程B";Thread tC = new Thread(new ThreadStart(TestThread.ThreadTst));tC.Name = "线程C";Thread tD = new Thread(new ThreadStart(TestThread.ThreadTst));tD.Name = "线程D";for (int z = 0; z < 20; z++){if (z == 3){Console.WriteLine("tA.Start");tA.Start();Console.WriteLine("tB.Start");tB.Start();}else if (z == 6){Console.WriteLine("tA.Join");tA.Join();Console.WriteLine("tB.Join");tB.Join();}else if (z == 9){Console.WriteLine("tC.Start");tC.Start();Console.WriteLine("tD.Start");tD.Start();}else{Console.WriteLine(Thread.CurrentThread.Name + "   z =  " + z);}}Console.Read();}
}

运行结果

MainThread   z =  0
MainThread   z =  1
MainThread   z =  2
tA.Start
tB.Start
MainThread   z =  4
MainThread   z =  5
tA.Join线程A   开始执行线程A   i =  0线程B   开始执行   ->注意这里并没有返回调用线程,这里是线程B线程B   i =  0线程A   i =  1线程B   i =  1线程A   i =  2线程B   i =  2线程A   i =  3线程B   i =  3线程A   i =  4线程B   i =  4线程A   i =  5线程B   i =  5线程A   i =  6线程B   i =  6线程A   i =  7线程B   i =  7线程A   i =  8线程B   i =  8线程B   i =  9线程A   i =  9线程A   执行完毕线程B   执行完毕
tB.Join              ->注意线程B已经执行完毕了
MainThread   z =  7
MainThread   z =  8
tC.Start
tD.Start
MainThread   z =  10
MainThread   z =  11
MainThread   z =  12
MainThread   z =  13
MainThread   z =  14
MainThread   z =  15
MainThread   z =  16
MainThread   z =  17
MainThread   z =  18
MainThread   z =  19线程C   开始执行    ->线程C是等主线程结束后才开始执行的线程C   i =  0线程D   开始执行线程D   i =  0线程C   i =  1线程D   i =  1线程C   i =  2线程D   i =  2线程C   i =  3线程D   i =  3线程C   i =  4线程D   i =  4线程C   i =  5线程D   i =  5线程C   i =  6线程D   i =  6线程C   i =  7线程D   i =  7线程C   i =  8线程D   i =  8线程C   i =  9线程D   i =  9线程C   执行完毕线程D   执行完毕

这个例子主要目的是对比使用join(线程A、)和未使用join(线程C)的区别

相关文章:

c#中Thread.Join()方法的经典示例

在 C# 中&#xff0c;Thread.Join 是一个非常有用的方法&#xff0c;它可以让主线程&#xff08;调用线程&#xff09;等待子线程&#xff08;被调用线程&#xff09;执行完毕后再继续执行。 1、经典示例1 using System; using System.Threading;public class Example {stati…...

深入了解越权漏洞:概念、危害与防范

前言 越权漏洞作为一种常见且极具威胁的安全隐患&#xff0c;就像隐藏在暗处的 “黑客帮凶”&#xff0c;时刻威胁着我们的数据安全和隐私。就让我们一起揭开越权漏洞的神秘面纱&#xff0c;深入了解它的来龙去脉、危害以及应对之策。 一、什么是越权漏洞 想象一下&#xff0…...

MySQL 数据库编程-C++

目录 1 数据库基本知识 1.1 MYSQL常见命令 1.2 SQL注入 1.3 ORM框架 1 数据库基本知识 MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成&#xff1a…...

dl学习笔记(9):pytorch数据处理的完整流程

1&#xff09;自动导入常用库的设置方式 在开始之前&#xff0c;这里介绍一下自动导入常用的你需要加载的库的操作方式。 首先在我们的目录下找到ipython文件&#xff0c;如下图&#xff1a; 然后找到里面的startup文件&#xff1a; 然后新建一个文本文档&#xff0c;输入你每…...

wps中的vba开发

推荐先学习vba语言&#xff08;兰色幻想80集&#xff09; 保存代码时注意保存为 .xlsm(启用宏的工作簿) 子程序SUN和函数FUNCTION&#xff1a; Sub 第一个程序()MsgBox "这是第一个程序"End Sub 注释Sub 第二个程序()Dim str As Stringstr "这是第二个程序&…...

力扣 LCR 078 合并K个升序链表

思路 解题过程 分治合并 与 LeetCode 21题 合并两个有序链表 相似 只是在此题的基础上增加了链表的数量。 使用递归将链表数组不断分成两半&#xff0c;直到分成的小组都只剩下一个链表元素为止&#xff0c;随后开始合并链表。 复杂度 时间复杂度: O(N * logK) K 为 链表(li…...

【hive】记一次hiveserver内存溢出排查,线程池未正确关闭导致

一、使用 MemoryAnalyzer软件打开hprof文件 很大有30G&#xff0c;win内存24GB&#xff0c;不用担心可以打开&#xff0c;ma软件能够生成索引文件&#xff0c;逐块分析内存&#xff0c;如下图。 大约需要4小时。 overview中开不到具体信息。 二、使用Leak Suspects功能继续…...

React Native 开发 安卓项目构建工具Gradle的配置和使用

gradle基本知识 gradle是React Native和Flutter调试、构建安卓App的打包工具。 gradle可以简单的类比为前端的webpack&#xff0c;webpack将源文件打包成HTML、CSS、JavaScript&#xff0c;而gradle将源文件打包成apk或aar&#xff08;Android Assemble Bundle&#xff09;。…...

IntelliJ IDEA新版本的底部version control(或git)里local change窗口显示配置修改详细教程

环境 IntelliJ IDEA 2024.3.2.2 (Ultimate Edition) Runtime version: 21.0.58-b631.30 aarch64 (JCEF 122.1.9) macOS 14.2.1 自己记录下。 步骤 设置 --> Version Control(版本控制) --> Commit(提交) --> 去掉勾选&#xff1a;Use non-modal commit interface…...

MySQL三大日志——binlog、redoLog、undoLog详解

日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息&#xff0c;能帮助我们进行很多容错及分析工作&#xff0c;其中有三大日志与我们这些开发者息息相关&#xff0c;本文将介绍binlog、redoLog、undoLog三种日志&#xff1a; 1. redoLog 1.1 为什么…...

MCU应用踩坑笔记(ADC 中断 / 查询法)

问题描述 IC&#xff1a;SC92F7596,在使用过程中&#xff0c;发现一个问题&#xff0c;就是我们使用到了ADC功能&#xff0c;程序的代码如下&#xff1a; ADC采样周期200ms &#xff0c;采样个数&#xff1a;4 在使用过程中&#xff0c;因配置了ADC中断使能&#xff0c;在中断…...

32.日常算法

1.最大子数组和 题目来源 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,…...

通过docker安装部署deepseek以及python实现

前提条件 Docker 安装:确保你的系统已经安装并正确配置了 Docker。可以通过运行 docker --version 来验证 Docker 是否安装成功。 网络环境:保证设备有稳定的网络连接,以便拉取 Docker 镜像和模型文件。 步骤一:拉取 Ollama Docker 镜像 Ollama 可以帮助我们更方便地管理…...

批量提取word表格数据到一个excel

新建一个excel到word同级目录altf11打开vba窗口并新建模块粘贴下方代码&#xff08;修改一些必要参数&#xff09;回到excel表格界面&#xff0c;altf8选择执行该宏注意要在信任中心开启运行vba宏 Sub 批量提取word表格数据到excel()Dim wdApp As Object, wdDoc As ObjectDim …...

使用 Axios 获取用户数据并渲染——个人信息设置

目录 1. HTML 部分&#xff08;前端页面结构&#xff09; HTML 结构解析&#xff1a; 2. JavaScript 部分&#xff08;信息渲染逻辑&#xff09; JavaScript 解析&#xff1a; 3. 完整流程 4. 总结 5. 适用场景 本文将介绍如何通过 Axios 从服务器获取用户信息&#xff0…...

DeepSeek在FPGA/IC开发中的创新应用与未来潜力

随着人工智能技术的飞速发展&#xff0c;以DeepSeek为代表的大语言模型&#xff08;LLM&#xff09;正在逐步渗透到传统硬件开发领域。在FPGA&#xff08;现场可编程门阵列&#xff09;和IC&#xff08;集成电路&#xff09;开发这一技术密集型行业中&#xff0c;DeepSeek凭借其…...

【GitLab CI/CD 实践】从 0 到 1 搭建高效自动化部署流程

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

【DeepSeek-R1训练笔记】随手记录一些训练log

背景说明 DeepSeek系列解读请移步我的上一篇blog&#xff1a;【完整版】DeepSeek-R1大模型学习笔记&#xff08;架构、训练、Infra&#xff09;代码仓库【科大的大四老哥太太太太太值得倾佩了】&#xff1a;https://github.com/Unakar/Logic-RLDeepSeek-R1-Zero复现文档&#…...

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具04

SQLSERVER的ImpDp和ExpDp工具演示 1、指定某些表作为导出对象外 (-exclude_table) 验证用&#xff1a;导出的表&#xff0c;导入到新的数据库 2、指定某些表作为导出对象外 (-exclude_table) 支持模糊检索&#xff0c;可以使用星号 以s开头的表作为导出对象外&#xff0c;…...

「全网最细 + 实战源码案例」设计模式——策略模式

核心思想 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;用于定义一系列算法或策略&#xff0c;将它们封装成独立的类&#xff0c;并使它们可以相互替换&#xff0c;而不影响客户端的代码&#xff0c;提高代码的可维护性和扩展性。 结构 …...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...