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

C#学习记录-线程

线程

定义:Thread t = new Thread(Test);   //可以用匿名  lamda

调用:t.Start("ljc6666");方法可以无参或一个参数,如果要传入多个参数,可以传入一个结构体

namespace _17_线程Thread
{internal class Program{static void Test(){Console.WriteLine("1");Thread.Sleep(3000);//子线程等3sConsole.WriteLine("2");}struct Data{public int Value;public int Value2;}static void show(object o){Data op = (Data)o;Console.WriteLine("给我什么打印什么:"+ op.Value + op.Value2.ToString());}delegate void TestDelegate();static void Main(string[] args){//Thread t = new Thread(Test);//t.Start();//Thread.Sleep(1000);//主线程等1s//Console.WriteLine("3");//Thread t = new Thread(() => Console.WriteLine("拉姆达表达式线程,线程id为:"+Thread.CurrentThread.ManagedThreadId));//t.Start();//Thread t = new Thread(delegate ()//{//    Console.WriteLine("匿名表达式线程,线程id为:" + Thread.CurrentThread.ManagedThreadId);//});//t.Start();//Console.WriteLine("主线程,线程id为:" + Thread.CurrentThread.ManagedThreadId);Data data = new Data();data.Value = 1;data.Value2 = 2;Thread t = new Thread(show);//t.Start("ljc6666");t.Start(data);}}
}

前后台线程

只有一个前台线程在运行,应用程序的进程就在运行,如果多个前台线程在运行,但是Main
方法结束了,应用程序的进程仍然是运行的,直到所有的前台线程完成其任务为止。
在默认情况下,用Thread类创建的线程是前台线程。线程池中的线程总是后台线程。
在用Thread类创建线程的时候,可以设置IsBackground属性,表示它是一个前台线程还是一
个后台线程
namespace _18_前台后台线程
{internal class Program{static void Test(){Console.WriteLine(Thread.CurrentThread.Name+"线程开启");Thread.Sleep(1000);Console.WriteLine(Thread.CurrentThread.Name+"线程结束");}static void Main(string[] args){Thread thread = new Thread(Test);thread.IsBackground = true;   //设置为后台线程//thread.IsBackground = false;    //设置为前台线程thread.Start();Console.WriteLine("主线程结束");}}
}

线程优先顺序以及状态

在Thead类中,可以设置Priority属性,以影响线程的基本优先级 ,Priority属性是一个
ThreadPriority枚举定义的一个值。定义的级别有Highest ,AboveNormal,Normal,BelowNormal 和 Lowest。
需要注意的是,并不是优先级高的执行完了才会执行低的;
另外,下面这个程序由于CPU都很充足,不能很好的体现优先级顺序
如果需要等待线程的结束,可以调用Thread对象的Join方法,表示把Thread加入进来,停
止当前线程,并把它设置为WaitSleepJoin状态,直到加入的线程完成为止。
namespace _19_线程优先级和状态
{internal class A{}internal class Program{static void A(){int i = 0;bool flag = true;while (flag){i++;Console.Write("a:"+i+" ");if (i>200000 )flag = false;}}static void B(){int i = 0;bool flag = true;while (flag){i++;Console.Write("b:" + i + " ");if (i > 200000)flag = false;}}static void C(){int i = 0;bool flag = true;while (flag){i++;Console.Write("c:" + i + " ");if (i > 200000)flag = false;}}static void Main(string[] args){Thread a = new Thread(A);Thread b = new Thread(B);Thread c = new Thread(C);a.Priority = ThreadPriority.Highest;b.Priority = ThreadPriority.Lowest;a.Start();b.Start();a.Join();Console.WriteLine("a线程结束");b.Join();Console.WriteLine("b线程结束");}}
}

线程池

线程池中的所有线程都是后台线程 ,如果进程的所有前台线程都结束了,所有的后台线程就会停
止。
不能把入池的线程改为前台线程 。
不能给入池的线程设置优先级或名称。
入池的线程只能用于时间较短的任务。 如果线程要一直运行(如 Word的拼写检查器线程),就应使
用Thread类创建一个线程。
namespace _20_线程池
{internal class Program{static void Download(object s){for (int i = 0; i <3;i++){Console.WriteLine("线程"+Thread.CurrentThread.ManagedThreadId+"正在下载");Thread.Sleep(100);}}static void Main(string[] args){for(int i = 0; i < 10;i++) {ThreadPool.QueueUserWorkItem(Download);}Thread.Sleep(5000);}}
}

任务

任务有两种启动方式,需要注意的是 任务是后台线程

连续任务

如果一个任务t1的执行是依赖于另一个任务t2的,那么就需要在这个任务t2执行完毕后才开
始执行t1。这个时候我们可以使用连续任务。
连续任务除了第一个任务之外方法都要有参数
namespace _21_任务
{internal class Program{static void DownLoad(){Console.WriteLine("正在下载,请等待...");Thread.Sleep(1000);}static void Ok(object a){Console.WriteLine("下载完成");}static void Main(string[] args){//TaskFactory tf = new TaskFactory();//Task T = tf.StartNew(DownLoad);//Task t = new Task(DownLoad);//t.Start();Task t1 = new Task(DownLoad);Task t2 = t1.ContinueWith(Ok);t1.Start();Thread.Sleep(1500);//任务是后台线程}}
}

资源访问冲突问题

当有多个地方同时访问一个资源时,可能会导致资源冲突(例如一个变量被多个地方使用),此时可以用锁的方式防止被多次调用

缺点:运行速度会降低

namespace _22_资源访问冲突问题
{internal class Class1{private object _lock = new object();private int state = 5;public void changestate() {lock (_lock){if (state == 5){state++;Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "状态为:" + state);}state = 5;}}}internal class Program{static void Main(string[] args){Class1 c1 = new Class1();for (int i = 0; i < 100; i++) {Thread thread = new Thread(c1.changestate);thread.Start();}}}
}

死锁问题

有多个锁的时候需要注意锁的先后顺序,下面这个讲的很好

408-多线程的死锁问题_哔哩哔哩_bilibili

相关文章:

C#学习记录-线程

线程 定义&#xff1a;Thread t new Thread(Test); //可以用匿名 lamda 调用&#xff1a;t.Start("ljc6666");方法可以无参或一个参数&#xff0c;如果要传入多个参数&#xff0c;可以传入一个结构体 namespace _17_线程Thread {internal class Program{stati…...

Spring Boot 启动注解分析

虽然我们在日常开发中&#xff0c;Spring Boot 使用非常多&#xff0c;算是目前 Java 开发领域一个标配了&#xff0c;但是小伙伴们仔细想想自己的面试经历&#xff0c;和 Spring Boot 相关的面试题都有哪些&#xff1f;个人感觉应该是比较少的&#xff0c;Spring Boot 本质上还…...

React Native数据存储

最近做RN开发中需要数据存储&#xff0c;查阅RN官方资料&#xff0c;发现推荐我们使用 AsyncStorage,对使用步骤做一下记录。 AsyncStorage是什么 简单的&#xff0c;异步的&#xff0c;持久化的key-value存储系统AsyncStorage在IOS下存储分为两种情况&#xff1a; 存储内容较…...

【网络编程】揭开套接字的神秘面纱

文章目录 1 :peach:简单理解TCP/UDP协议 :peach:2 :peach:网络字节序 :peach:3 :peach:socket编程接口 :peach:3.1 :apple:socket 常见API :apple:3.2 :apple:sockaddr结构:apple: 4 :peach:简单的UDP网络程序 :peach:4.1 :apple:基本分析:apple:4.2 :apple:udpServer.hpp(重点…...

MySQL 8.0 事务定义和基本操作

MySQL 事务&#xff08;Transaction&#xff09;的四大特性&#xff1a;A、C、I、D A、原子性&#xff1a;&#xff08;Atomicity&#xff09; 一个事务是不可分割的最小工作单位。 执行的事务&#xff0c;要么全部成功&#xff0c;要么回滚到执行事务之前的状态。 C、一致…...

项目经理必备:常用的项目管理系统推荐!

当我们成为项目负责人时&#xff0c;找到合适的工具来管理跟进项目&#xff0c;就成为了迫切需要解决的问题。一款优秀的工具&#xff0c;在项目的管理跟进中&#xff0c;起着极为重要的作用&#xff0c;一般可以付费购买专门的项目管理软件。 1.可快速切换查看不同角度的项目信…...

【香瓜说职场】信任危机(2022.08.19)

自从17年4月份开始辞职创业&#xff0c;已经5年零4个月了。今天跟大家聊一点不太正能量的事。 首先关于“要不要说些不好的”这件事&#xff0c;我爸妈常建议我不要把不好的事情写出来&#xff0c;因为觉得丢人、不体面、怕影响合伙人关系、影响同事关系。而我觉得如果只写好的…...

【Rust】Rust学习 第六章枚举和模式匹配

本章介绍 枚举&#xff08;enumerations&#xff09;&#xff0c;也被称作 enums。枚举允许你通过列举可能的 成员&#xff08;variants&#xff09; 来定义一个类型。首先&#xff0c;我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来&#xff0c;我们会…...

Win10安装GPU支持的最新版本的tensorflow

我在安装好cuda和cudnn后&#xff0c;使用pip install tensorflow安装的tensorflow都提示不能找到GPU&#xff0c; 为此怀疑默认暗转的tensorflow是不带GPU支持的。 在tensorflow官网提供了多个版本的GPU支持的windows的安装包 https://www.tensorflow.org/install/pip?hlz…...

20个Golang自动化DevOps库

探索 20 个用于简化任务和提高生产力的重要库。 Golang&#xff0c;也称为 Go&#xff0c;是一种静态类型、编译型编程语言&#xff0c;由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 设计。它于 2009 年推出&#xff0c;旨在解决其他编程语言的缺点&#xff0c;特…...

【WiFi】WiFi 6E最新支持的国家和频段

信道Map图 国家和频段 CountryStatus Spectrum Andorra Adopted Considering 5945-6425 MHz 6425-7125 MHz ArgentinaAdopted5925-7125 MHzAustralia Adopted Considering 5925-6425 MHz 6425-7125 MHz Austria Adopted Considering 5945-6425 MHz 6425-7125 MHz BahrainA…...

如何使用html,包括css,js 画思维导图?有哪些可用的方法?

首先&#xff0c;创建一个新的HTML文件&#xff0c;可以使用任何文本编辑器。在文件中添加必要的标签和结构来定义网页的内容和布局。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>Mind Map</title><link re…...

机器学习---梯度下降代码

1. 归一化 # Read data from csv pga pd.read_csv("pga.csv") print(type(pga))print(pga.head())# Normalize the data 归一化值 (x - mean) / (std) pga.distance (pga.distance - pga.distance.mean()) / pga.distance.std() pga.accuracy (pga.accuracy - pg…...

【VB6|第23期】原来Jet.OLEDB也可以读取新版.xlsx的Excel文件

日期&#xff1a;2023年8月11日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…...

通过控制ros节点的启停,软实现人工控制和紧急停止功能的图示

通过控制ros节点的启停&#xff0c;软实现人工控制和紧急停止功能的图示 实现原理简介&#xff1a; 人工控制的节点&#xff1a; 键盘节点 方向盘节点 自动控制的节点&#xff1a; movebase 导航 autoware 等 底盘节点&#xff1a; 差速底盘 阿克曼底盘 控制节点&#xff1…...

面试热题(滑动窗口最大值)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出&#xff1a;[3,3,5,…...

【代码】表格封装 + 高级查询 + 搜索 +分页器 (极简)

一、标题 查询条件按钮&#xff08;Header&#xff09; <!-- Header 标题搜索栏 --> <template><div><div class"header"><div class"h-left"><div class"title"><div class"desc-test">…...

ant.design 组件库中的 Tree 组件实现可搜索的树: React+and+ts

ant.design 组件库中的 Tree 组件实现可搜索的树&#xff0c;在这里我会详细介绍每个方法&#xff0c;以及容易踩坑的点。 效果图&#xff1a; 首先是要导入的文件 // React 自带的属性 import React, { useMemo, useState } from react; // antd 组件库中的&#xff0c;输入…...

Linux系统编程之信号(上)

一、信号概念 信号就是软件中断。每当程序收到一个信号&#xff0c;都需要按指定的方法去处理。以下是UNIX系统的信号表。 其中core表示产生一个复制了该进程内存映像的core文件&#xff0c;它保存了程序现场&#xff0c;可以使用gdb来调试。 二、signal() signal()函数用于改…...

23.Netty源码之内置解码器

highlight: arduino-light Netty内置的解码器 在前两节课我们介绍了 TCP 拆包/粘包的问题&#xff0c;以及如何使用 Netty 实现自定义协议的编解码。可以看到&#xff0c;网络通信的底层实现&#xff0c;Netty 都已经帮我们封装好了&#xff0c;我们只需要扩展 ChannelHandler …...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...