C#线程学习,线程的创建,线程的暂停,线程的锁lock,Monitor,线程使用中的注意事项(一)

C#线程学习,线程的创建,线程的暂停,线程的锁lock,Monitor,线程使用中的注意事项(一)

八股文

线程和进程

进程是指程序的一次执行过程,而线程是指进程中执行的一条单一逻辑控制流。
进程是由多个线程组成的,一个进程至少有一个线程,叫做主线程。可以在任务管理器中查看有几个线程,几个进程。
C#中的线程不支持获取返回值,如果想获取返回时需要使用task

Foreground线程和Background线程

Foreground默认的, 只要有一个Foregournd线程在执行,应用程序就不会关闭。Background线程则不是,程序一旦退出Background立刻关闭。通过IsBackground查看属性

注意事项

  1. 异常捕获代码应该写在线程代码的内部,而不是调用的位置
  2. 同一个变量如果在两个线程修改那么另外一个也会修改,不同的线程是共享全局变量的

代码

  1. 线程的创建
  2. 线程间的变量共享
  3. 线程中使用lock进行锁,解决线程中变量共享的问题
  4. 线程中使用Monitor进行锁,解决线程中变量共享的问题
using System;
using System.Threading;
using static System.Net.Mime.MediaTypeNames;namespace csharp线程学习
{internal class Program{static void Main(string[] args){线程的创建//Console.WriteLine("\n线程的创建");//CreatMyThread_1();//无参数//CreatMyThread_2();//有参数//CreatMyThread_3();//有参数//CreatMyThread_4();//使用lamada表达式两个线程共享全局变量Console.WriteLine("\n线程中,全局变量是共享的");//Thread thread1 = new Thread(Func1);//thread1.Start();//Thread thread2 = new Thread(Func2);//thread2.Start();//使用线程锁,来解决变量共享的问题Console.WriteLine("\n线程中,使用lock线程锁");//Thread thread1 = new Thread(ThreadLine1);//thread1.Start();//Thread thread2 = new Thread(ThreadLine2);//thread2.Start();//使用线程锁,Console.WriteLine("\n线程中,使用Monitor线程锁");Thread thread1 = new Thread(ThreadLine4);thread1.Start();Thread thread2 = new Thread(ThreadLine5);thread2.Start();Console.ReadLine();Console.ReadLine();}/// <summary>/// 创建线程的方式_1/// </summary>private static void CreatMyThread_1(){//创建线程的方式Thread thread = new Thread(ThreadProc);thread.Start();}/// <summary>/// 创建线程的方式有参数_2s/// </summary>private static void CreatMyThread_2(){Thread m_thrad = new Thread(new ParameterizedThreadStart(ThreadProcWithPro));//创建一个有参数的线程m_thrad = new Thread(ThreadProcWithPro);m_thrad.Start("今天是2023年");}/// <summary>/// 创建线程的方式有参数_3/// </summary>private static void CreatMyThread_3(){Thread m_thrad = new Thread(ThreadProcWithPro);//创建一个有参数的线程m_thrad.Start("今天是2023年");}/// <summary>/// 创建线程的方式有参数_4/// </summary>private static void CreatMyThread_4(){Thread t = new Thread(() => Console.WriteLine("Hello!"));}private static void ThreadStop(){Thread m_thrad = new Thread(new ParameterizedThreadStart(ThreadProcWithPro));//创建一个有参数的线程m_thrad = new Thread(ThreadProcWithPro);m_thrad.Start("今天是2023年");m_thrad.Join();//通过添加异常停止}/// <summary>/// 一个可以被执行的方法,没有参数/// </summary>private static void ThreadProc(){for (int i = 0; i < 5; i++){Console.WriteLine("你好,我的朋友");Thread.Sleep(0);}}/// <summary>/// 一个可以被执行的方法,有参数/// </summary>/// <param name="strpar">object类型的参数</param>private static void ThreadProcWithPro(object strpar){Console.WriteLine("传递的参数是:" + (string)strpar);}//用于演示两个线程之间全局变量是共享的public static int number = 0;private static void Func1(){for (; number < 10; number++){if (number == 4){Thread.Sleep(10);}Console.WriteLine($"当前是线程1, number={number}");}}private static void Func2(){for (; number < 10; number++){if (number == 5){Thread.Sleep(10);}Console.WriteLine($"当前是线程2, number={number}");}}//线程的锁,两个线程中如果有lock必须要等到当前线程执行完毕之后才能进行下一个private static object locktokenA = new object();//锁必须是引用类型private static void ThreadLine1(){lock (locktokenA){for (; number < 10; number++){if (number == 5){Thread.Sleep(10);}Console.WriteLine($"当前是线程1, number={number}");}}}private static void ThreadLine2(){lock (locktokenA){for (; number < 15; number++){if (number == 7){Thread.Sleep(10);}Console.WriteLine($"当前是线程2, number={number}");}}}//使用Monitor锁来控制多线程private static void ThreadLine4(){Monitor.Enter(locktokenA);for (; number < 10; number++){if (number == 5){Thread.Sleep(10);}Console.WriteLine($"当前是线程1, number={number}");}Monitor.Exit(locktokenA);}private static void ThreadLine5(){Monitor.Enter(locktokenA);for (; number < 15; number++){if (number == 7){Thread.Sleep(10);}Console.WriteLine($"当前是线程2, number={number}");}Monitor.Exit(locktokenA);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/129707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis ACL安全策略详解

一&#xff0c;redis新特性ACL安全策略介绍 在 Redis6 之前的版本&#xff0c;我们只能使用 requirepass 参数给 default 用户配置登录密码&#xff0c;同一个 redis 集群的所有开发都共享 default 用户&#xff0c;难免会出现误操作把别人的 key 删掉或者数据泄露的情况。 因此…

基于单片机的智能鱼缸控制系统的设计与实现

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、开发技术和原理的相关知识2.1开发设计目标2.2 开发设计使用技术和原理2.2.1嵌入式技术2.2.2传感器技术 二、基于单片机的智能鱼缸控制系统的总体设计3.1智能鱼缸控制系统的基本组成3.1.1系统的构成部分3.2需求…

高校动物实验室建设要点

高校动物实验室应按照合理的规划布局进行设计&#xff0c;以便满足实验教学和科学研究的需求。如区分功能区域。根据实验室的不同功能&#xff0c;划分出饲养区、实验区、准备区和储存区等功能区域。动物房应根据不同种类动物的需求进行布置&#xff0c;确保各种动物的饲养条件…

uni-app 解决钉钉小程序日期组件uni-datetime-picker不兼容ios问题

最近在使用uni-app开发 钉钉小程序 &#xff0c;遇到一个ios的兼容性问题 uni-datetime-picker 组件在模拟器上可以使用&#xff0c;在真机上不生效问题 文章目录 1. 不兼容的写法&#xff0c;uni-datetime-picker 不兼容IOS2. 兼容的写法&#xff0c;使用 dd.datePicker 实现。…

【ZMQ】ZMQ/ZeroMQ简介、三种消息模式demo程序

ZMQ/ZeroMQ简介、三种消息模式demo程序 一、什么是ZMQ二、ZMQ的特点三、Demo程序代码3.1 发布-订阅模式&#xff08;P/S&#xff09;demo3.2 请求-应答模式&#xff08;REQ/RES&#xff09;demo3.3 推拉模式&#xff08;P/P&#xff09;demo 一、什么是ZMQ ZeroMQ&#xff08;…

Java数组小练习求出数组中的最大值

加油&#xff0c;新时代打工人&#xff01; Java基础八之数组的定义和获取元素 package demo;/*** author wenhao* date 2023/11/04 10:47* description 数组练习*/ public class ArrDemo {public static void main(String[] args) {//求一个数组中的最大值int [] arr {66,12…

ActiveMQ是什么?-九五小庞

MQ是消息中间件&#xff0c;是一种在分布式系统中应用程序借以传递消息的媒介&#xff0c;常用的有ActiveMQ&#xff0c;RabbitMQ&#xff0c;kafka。ActiveMQ是Apache下的开源项目&#xff0c;完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。特点&#xff1a;1、支持多种语言…

Cross-Entropy Loss(多分类损失函数)

文章目录 1. 网络输出output&#xff1a;score2. Cross-Entropy Loss(多分类损失函数) 1. 网络输出output&#xff1a;score 2. Cross-Entropy Loss(多分类损失函数) 先用softmax function把score 变成 probabilities。再用交叉熵损失函数来进行Loss的计算

10个常用的React UI组件库

背景&#xff1a;在快速变化的前端开发世界中&#xff0c;react前端框架简洁明了&#xff0c;赢得了全球开发者的广泛青睐&#xff0c;相比于从零开始创建每一个组件&#xff0c;使用现成的 React UI 组件库可以极大地提高我们的开发效率&#xff0c;React社区已经积累了大量优…

【Midjourney入门教程4】与AI对话,写好prompt的必会方法

文章目录 1、语法2、单词3、要学习prompt 框架4、善用参数&#xff08;注意版本&#xff09;5、善用模版6、临摹7、垫图 木匠不会因为电动工具的出现而被淘汰&#xff0c;反而善用工具的木匠&#xff0c;收入更高了。 想要驾驭好Midjourney&#xff0c;可以从以下方面出发调整&…

搭建 L2TP over IPSec VPN

记得开放允许访问 UDP 500、1701、4500共3个端口 1. 服务器安装软件: yum -y install openswan xl2tpd ppp2. 服务器配置文件 /etc/ipsec.conf 修改内容如下&#xff0c;云服务器一般网卡地址填私网地址: config setupprotostacknetkeylogfile/var/log/ipsec.logvirtual_pri…

智能工厂架构

引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <

JumpServer开源堡垒机与万里安全数据库完成兼容性认证

近日&#xff0c;中国领先的开源软件提供商FIT2CLOUD飞致云宣布&#xff0c;JumpServer开源堡垒机已经与万里安全数据库软件GreatDB完成兼容性认证。针对产品的功能、性能、兼容性方面&#xff0c;经过双方共同测试&#xff0c;万里安全数据库软件&#xff08;简称&#xff1a;…

软件测试用例方法---边界值法

原则&#xff1a; 输入最小值&#xff08;min&#xff09;、稍大于最小值&#xff08;min&#xff09;、域内任意值&#xff08;nom&#xff09;、稍小于最大值&#xff08;max-&#xff09;、最大值&#xff08;max&#xff09; 写法&#xff1a;“单故障”假设&#xff08;致…

Redis Part2

Redis中如何的去存放一个Java对象&#xff1f; 直接存放Json类型即可&#xff0c;因为我们Json类型最终就是一个String类型。 Spring Boot整合Redis 三步骤完成SpringBoot对Redis数据库的整合 引入spring-boot-starter-data-redis依赖在application.yml中配置Redis信息注入Re…

关于pytorch张量维度转换及张量运算

关于pytorch张量维度转换大全 1 tensor.view()2 tensor.reshape()3 tensor.squeeze()和tensor.unsqueeze()3.1 tensor.squeeze() 降维3.2 tensor.unsqueeze(idx)升维 4 tensor.permute()5 torch.cat([a,b],dim)6 torch.stack()7 torch.chunk()和torch.split()8 与tensor相乘运算…

Unity中Shader的GI相关数据的准备

文章目录 前言一、把 Unity 中用到的 GI 的函数移植到我们自定义的 cginc 文件中二、开始使用和 GI 相关的方法1、了解 UnityGI 结构体的内容,并且准备 UnityGI 的数据2、了解 SurfaceOutput 结构体&#xff0c;并且准备数据3、了解并准备 UnityGIInput 结构体&#xff0c;并且…

centos7安装oxidized备份软件

首先需要提前下载ruby&#xff0c;因为默认yum安装的版本太低 https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz 1、yum remove ruby ruby-devel&#xff08;有就卸载&#xff0c;没有则忽略&#xff09; 2、将下载好的ruby包解压到/opt下 [rootoxidized ruby-…

第6章_多表查询

文章目录 多表查询概述1 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积理解演示代码 2 多表查询分类讲解2.1 等值连接 & 非等值连接2.1.1 等值连接2.1.2 非等值连接 自连接 & 非自连接内连接与外连接演示代码 3 SQL99语法实现多表查询3.1 基本语法3.2 内连接&#x…

汽车托运3种运车方式对比

汽车托运有以下几种托运方式&#xff1a;笼车托运&#xff0c;小板托运&#xff0c;火车托运;这几种托运方式的托运时长及托运费用都不一样。下面分别介绍一下&#xff0c;3种托运方式的优点及不便。 ①笼车托运。价格在1-2元/公里&#xff0c;笼车托运是目前主流的托运方式。笼…