Unity 线程相关知识

线程

线程介绍

通过线程执行函数和直接在主函数中调用函数的区别是:通过直接调用函数时会按照语句顺序逐句执行,必定会完成上一句后再执行下一句,而通过线程执行的函数会从调用开始与主函数同步执行

调用线程的方式

调用无参数函数线程的方法:

    void Start(){Thread thread = new Thread(SendThread);thread.Start();}void SendThread(){Debug.Log("调用线程");}

调用有参数函数线程时,使用lambda表达式在创建线程时传入函数的参数

    void Start(){Thread t1 = new Thread(() => { SendThread("一", 100); });Thread t2 = new Thread(() => { SendThread("二", 50); });Thread t3 = new Thread(() => { SendThread("三", 25); });t1.Start();t2.Start();t3.Start();}void SendThread(string name,int i){while (i >= 0){Debug.Log(name + "执行剩余" + i--);}}

线程休眠 

调用Thread.Sleep(int)方法

public static void Sleep(int millisecondsTimeout);

传入的参数为毫秒,1000毫秒等于一秒

            //线程休眠一秒Thread.Sleep(1000);

线程池

线程池介绍

在调用线程的时候,会先创建线程,然后再线程结束后销毁线程,如果频繁对线程进行创建和销毁会极大的损耗计算机的性能,所以在频繁创建逻辑简短的线程的时候,最好使用线程池

调用线程池的方法

能够在线程池中调用的线程与直接创建线程不同的地方在于:线程池中调用的线程的参数必须限定格式,线程池能调用的线程必须只能拥有一个object类型的参数

通过ThreadPool.QueueUserWorkItem方法使用线程池调用线程

public static bool QueueUserWorkItem(WaitCallback callBack, object state);

第一个参数为想要执行线程的函数,函数必须只有一个object参数

第二个参数为传递给线程函数的参数

与直接创建线程不同的是,线程池中的线程不需要Start,添加线程时自动开始执行

示例代码:

    void Start(){ThreadPool.QueueUserWorkItem(SendThreadPool,10);ThreadPool.QueueUserWorkItem(SendThreadPool,10.01);ThreadPool.QueueUserWorkItem(SendThreadPool,"十");}void SendThreadPool(object obj){for (int i = 0; i < 10; i++){Debug.Log(obj.ToString() + "剩余" + i);}}

设置线程池中最多同时运行线程数量

public static bool SetMaxThreads(int workerThreads, int completionPortThreads);

第一个参数为线程池中辅助线程的最大数目,与第二个参数相同即可

第二个参数为线程池中异步 I/O 线程的最大数目,与第一个参数相同即可

示例代码:

ThreadPool.SetMaxThreads(10,10);

线程同步

线程同步介绍

线程的运行是不规律的,结果不可控的,可能会涉及到一个线程中使用一个值之前这个值被另一个线程改变了,从而导致出现未知错误,这种情况下就需要控制线程执行的顺序,规避问题

Mutex 互斥锁

通过定义Mutex类型变量互斥锁,来达到同步效果,可以在执行重要逻辑前先对Mutex类型变量进行锁定,然后第二个线程尝试执行锁定Mutex变量时如果Mutex变量已被锁定,则第二个线程将会暂停运行,直到第一个锁定Mutex变量的线程将Mutex变量解锁,第二个线程才会继续锁定Mutex变量并开始工作,直到再次解锁Mutex变量为止

示例代码:

    int number;Mutex mutex = new Mutex();void Start(){Thread t1 = new Thread(() => { SendThread("一",10); });Thread t2 = new Thread(() => { SendThread("二",8); });Thread t3 = new Thread(() => { SendThread("三",5); });t1.Start();t2.Start();t3.Start();}void SendThread(string name,int i){for (; i > 0; i--){mutex.WaitOne();for (int j = 0; j < i; j++){number += i;Debug.Log(name + "给数值增加了" + i + "现在的数值为" + number);}mutex.ReleaseMutex();}}

Lock 变量锁

通过Lock关键字来达到同步效果,和Mutex使用相似,执行重要逻辑前,锁住任意变量,将逻辑写入lock语句内,其余线程执行lock发现lock中的变量被锁住将会等待,等待前一线程的lock执行完毕释放lock关键字中的变量后再执行(lock锁住的变量可以和需要保护的变量毫无关系,可以锁住任意变量达到效果,但注意变量类型必须是引用类型,值类型变量无法使用lock关键字)

示例代码:

    int number;object obj = new object();void Start(){Thread t1 = new Thread(() => { SendThread("一",10); });Thread t2 = new Thread(() => { SendThread("二",8); });Thread t3 = new Thread(() => { SendThread("三",5); });t1.Start();t2.Start();t3.Start();}void SendThread(string name,int i){for (; i > 0; i--){lock (obj) {for (int j = 0; j < i; j++){number += i;Debug.Log(name + "给数值增加了" + i + "现在的数值为" + number);}}Thread.Sleep(100);}}

Semaphore 多通道锁

Semaphore与Mutex不同的地方在于,Mutex一次只能固定允许一个线程访问,而Semaphore可以设置最多同时访问的最大数量,如果给Semaphore的最大访问值设置为2,同时有10个线程需要访问时,只有前2个线程能够成功访问,而剩余的8个线程则需要等待,等前两个线程执行完后,再同时让第3和第4个访问通道的线程执行,剩余的6个线程等待,直到执行完毕

示例代码:

    int number;Semaphore semaphore = new Semaphore(2,2);void Start(){Thread t1 = new Thread(() => { SendThread("一", 10); });Thread t2 = new Thread(() => { SendThread("二", 8); });Thread t3 = new Thread(() => { SendThread("三", 5); });t1.Start();t2.Start();t3.Start();}void SendThread(string name, int i){for (; i > 0; i--){semaphore.WaitOne();for (int j = 0; j < i; j++){number += i;Debug.Log(name + "给数值增加了" + i + "现在的数值为" + number);}semaphore.Release();}}

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

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

相关文章

.NET Core中间件管道MAP的作用和使用

在ASP.NET Core中&#xff0c;中间件是构建HTTP请求管道的基本组件。中间件组件负责在ASP.NET Core应用程序中处理请求和响应。中间件可以执行多种任务&#xff0c;例如身份验证、记录、异常处理等。你可以按顺序将多个中间件组件组合在一起&#xff0c;形成一个请求处理管道。…

java读取Excel表格数据

java读取Excel表格数据 环境说明项目结构1.controller层2.service层实现层StudentModel.java类 使用的Maven依赖效果示例一效果示例二文档截图第一页第二页 postman请求说明其他说明 环境说明 jdk1.8&#xff0c;springboot2.5.3 项目结构 1.controller层 package com.exam…

Taro-vue微信小程序用户隐私保护

Taro-vue微信小程序用户隐私保护 一、在 微信公众平台的【设置】- 【服务内容与声明】 &#xff0c;设置用户隐私保护指引&#xff0c;添加项目需要的接口权限。 【用户隐私保护指引】提交之后&#xff0c;官方会进行审核。审核通过之后&#xff0c;对应的接口权限才会生效。 …

区块链安全应用----压力测试

通过Caliper进行压力测试程序 1.环境配置 第一步. 配置基本环境 部署Caliper的计算机需要有外网权限&#xff1b;操作系统版本需要满足以下要求&#xff1a;Ubuntu > 16.04、CentOS > 7或MacOS > 10.14&#xff1b;部署Caliper的计算机需要安装有以下软件&#xff…

【C语言回顾】函数

前言1. 函数的概念和分类2.库函数3. 自定义函数3.1 自定义函数的简单介绍3.2 自定义函数举例 4. 形参和实参4.1 形参4.2 实参4.3 形参和实参的关系4.3.1 理解4.3.2 举例代码和调试 5. 嵌套函数和链式访问5.1 嵌套函数5.2 链式访问 6. 函数的声明和定义6.1 单个文件6.2 多个文件…

Pandas连接MySQL数据库

pandas是一个强大的Python工具包&#xff0c;能够快速帮助我们做很多数据处理。但是在利用pandas连接数据库时&#xff0c;也会遇到很多问题&#xff0c;在此我总结了一个相对较为简单的连接范式&#xff0c;供大家参考学习。 先上代码&#xff1a; import pandas as pd# 数据…

ChatGPT在遥感领域中的应用

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

中文编程入门(Lua5.4.6中文版)第十三章 Lua 文件操作

在《Lua世界》的冒险旅途中&#xff0c;勇士们时常需要与神秘的文本卷轴打交道。为了更好地掌握这些知识宝藏&#xff0c;Lua I/O库提供了两种强大的探索模式&#xff1a;简单模式和完全模式&#xff0c;助你轻松应对各类文献挑战。 简单模式&#xff1a;初识卷轴 简单模式如…

C# aspose word实现模板方式打印及打印速度慢解决方法

1.引用dll nuget或者网上都有下载的方式。不过都要收费。下载地址&#xff1a;https://files.cnblogs.com/files/rolayblog/Tool.zip?t1713322422&downloadtrue 2.打印模板设计 新建一个doc文档&#xff0c;根据自己的需求画页面。 A、普通文本 在word中需要替换值的地方添…

《2024最新Java面试题及答案(带完整目录)》

获取链接&#xff1a;《2024最新Java面试题及答案&#xff08;带完整目录&#xff09;》 更多技术书籍&#xff1a;技术书籍分享&#xff0c;前端、后端、大数据、AI、人工智能... ​ ​ ​ 4.1.9.8. 可重入锁&#xff08;递归锁&#xff09; ...........................…

Oracle11.2.0.1,(CVE-2012-1675)漏洞解决方案

1.进入容器停止监听 docker exec -it -u 0 oracle11g bash su - oracle lsnrctl stop listener2.找到监听配置文件位置&#xff0c;修改监听文件 echo $ORACLE_HOMEvi network/admin/listener.ora #在文件底部添加 SECURE_REGISTER_LISTENER (IPC) #启动监听 lsnrctl start …

基于springboot+vue+Mysql的汽车租赁系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

idea运行报错:启动命令过长

JAVA项目&#xff0c;运行的时候报错 Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun老问题了&#xff0c;记录一下 解决办法&#xff1a; 1、Edit Configurations 2、点击Modify options设置&#xff0c;勾选S…

PlistEdit Pro for Mac激活版:强大的Plist文件编辑工具

PlistEdit Pro for Mac是一款专为Mac用户设计的强大Plist文件编辑工具。Plist文件是苹果公司开发的一种XML文件格式&#xff0c;用于存储应用程序的配置信息和数据。这款软件为用户提供了直观、易用的界面&#xff0c;使编辑和管理Plist文件变得轻松简单。 PlistEdit Pro for M…

C++设计模式|创建型 3.抽象工厂模式

在上一篇文章中介绍了工厂模式&#xff0c;每个具体工厂负责生产一个专门的产品&#xff0c;其代码扩展性很好&#xff0c;这篇文章将介绍抽象工厂模式。 1.为什么要使用抽象工厂模式&#xff1f; 既然已经有了“工厂模式”&#xff0c;那为什么还会有抽象工厂模式呢&#xf…

ubuntu常用方法

文本文件的创建&#xff1a; sudo touch ubuntu.txt move clock: sudo chmod 777 ubuntu.txt 安装chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt install ./google-chrome-stable_current_amd64.deb .sh 文件的安装 例…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(1)——场景故事介绍

生成NPC为交互应用程序创建逼真的人类行为模拟。在这项工作中&#xff0c;我们通过将二十五个NPC放置在一个沙盒环境中&#xff08;类似于The Sims&#xff0c;模拟人生&#xff09;&#xff0c;展示了生成NPC的能力。用户可以观察和干预NPC的日常计划、分享新闻、建立关系以及…

web配置https

Tomcat8 配置&#xff1a; 1.单向认证&#xff0c;就是传输的数据加密过了&#xff0c;但是不会校验客户端的来源 2.双向认证&#xff0c;如果客户端浏览器没有导入客户端证书&#xff0c;是访问不了web系统的&#xff0c;找不到地址 如果只是加密&#xff0c;我感觉单向就行…

就业班 第三阶段(ansible) 2401--4.16 day2 ansible2 剧本+角色

六、Ansible playbook 简介 playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。   通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的…

人工智能电话机器人常见的问题有哪些?

随着业务的不断拓展&#xff0c;电销业务量也不断攀升。公司为了控制用人成本&#xff0c;电销人员数量有限&#xff0c;而且培训上岗周期慢&#xff0c;这就导致成交率、销售额无法完成&#xff0c;电话机器人的出现&#xff0c;有效的解决了这些痛点&#xff0c;只需电销人员…