并发编程/线程同步/线程同步深入/线程池/异步编程/Tas任务

2023-10-24 21:50

本文主要是介绍并发编程/线程同步/线程同步深入/线程池/异步编程/Tas任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:并发编程:

《1》:进程
通俗的讲,一个exe运行一次就会产生一个进程,一个exe的多个进程之间数据互相隔离。
1.一个进程里至少有一个线程:主线程。我们平时写的控制台程序默认就是单线程的,代码从上往下执行,一行执行完了再执行下一行;
2.什么是多线程:一个人一边烧水一边洗衣服比“先烧水再洗衣服”效率高。同一时刻一个人做多件件事情,只是在“快速频繁切换”,如果处理不当可能比不用多线程效率还低。讨论多线程先只考虑“单核cpu”。
3.普通的代码是从上向下执行的,但是多线程的代码可以“并行”执行,我们可以把“线程”理解成独立的执行单元,线程中的代码可以“并行执行”。线程根据情况被分配给一定的“时间片”来运行,可能一个线程还没执行完,就又要把时间片交给别的线程执行。把要在单独的线程放到一个方法中,然后创建 Thread 对象,运行它,这个 Thread 中的代码就会在单独的线程中执行。
4. 多线程的好处:有很大可能增加系统的运行效率;开发winform程序,避免界面卡;注册后向用户发送欢迎邮件,如果发送邮件很慢的话,避免注册过程很慢。
5. 线程默认是“非后台线程”,一个程序必须所有“非后台线程”执行结束后程序才会退出, 否则看起来好像是主线程退出了,其实进程还没有结束(搞一个winform 程序演示)把线程设置为“后台线程”后,所有“非后台线程”执行结束后程序就会退出,不会等“后台线程”执行结束:
thread.IsBackground = true;
简单的验证:控制台程序,如果不加 t1.IsBackground = true; 是线程执行结束才退出。加上的话就是“闪退”。

二:线程同步

《1》:定义:
线程同步问题就是解决多个线程同时操作一个资源的问题,多个线程对于资源的使用,必须等所有的线程使用完成之后再进行处理
while(th1.IsAlive);操作会大量消耗cpu空转,可以改成th1.Join()就是让当前线程等待th1线程的结束。

class Program{static int count = 0;   //定义一个变量static void Main(string[] args){//实例化一个线程对象用th1表示Thread th1 = new Thread(() =>{for (int i = 0; i < 10; i++){count++;Console.WriteLine("th1:" + count);Thread.Sleep(100);   //将当前线程挂起100ms}});th1.Start();   //线程的调用Thread th2 = new Thread(() =>{for (int i = 0; i < 10; i++){count++;Console.WriteLine("th2:" + count);Thread.Sleep(100);}});th2.Start();while (th1.IsAlive)    //获取当前线程执行状态的值并处于死循环{}while (th2.IsAlive){}Console.WriteLine(count);     //最终输出结果countConsole.ReadLine();}}

在这里插入图片描述

《2》:实现:
(1):Join
原理,等待耗时最长的线程执行完成之后在处理公共资源,给耗时最长的线程调用Join方法
(2):lock
改用lock解决多个线程同时操作一个资源。lock是C#中的关键字,他要锁定一个资源
lock的特点是:同时只能有一个线程进入lock的对象的范围,其他lock的线程就要等。

class Program{static int count = 0;    //定义一个静态的变量static Object o = new Object();    //新实例化一个静态的object对象static void Main(string[] args){Console.WriteLine(DateTime.Now.ToLongTimeString());//实例化一个线程对象用th1表示Thread th1 = new Thread(() =>{for (int i = 0; i < 10; i++){lock (o)    //同时只能有一个线程进入lock的对象的范围,其他lock的线程就要等。{count++;}Console.WriteLine("th1:" + count);Thread.Sleep(100);   //线程休眠时间100ms}});th1.Start();   //启动线程Thread th2 = new Thread(() => //Lambda表达式传值   实际上是构建了一个匿名函数 通过函数闭包来传值{for (int i = 0; i < 10; i++){lock (o){count++;}Console.WriteLine("th2:" + count);

这篇关于并发编程/线程同步/线程同步深入/线程池/异步编程/Tas任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277995

相关文章

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的