多线程应用

多线程初始

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace _01_多线程初始
{public partial class Form1 : Form{public Form1(){InitializeComponent();//访问当前代码执行的线程Thread thread =Thread.CurrentThread;thread.Name = "主";}private void tzm(){Console.WriteLine($"当前任务执行在{Thread.CurrentThread.Name}线程");Thread.Sleep(5000);//暂停   暂停5秒,模拟挑芝麻的耗时事件MessageBox.Show("芝麻调好了,滚!!!!!");}private void button1_Click(object sender, EventArgs e){tzm();}private void button2_Click(object sender, EventArgs e){MessageBox.Show("给");}private void button3_Click(object sender, EventArgs e){//用分线程执行耗时任务//1.创建一个委托,用于告诉线程要干什么工作ThreadStart threadStart  = new ThreadStart(tzm);//2.创建一个线程,并告知其任务Thread t =new Thread(threadStart);t.Name = "分";//3.启动线程,开始执行任务t.Start();}}
}

多线程案例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace _02_多线程案例
{public partial class Form1 : Form{public Form1(){InitializeComponent();Thread.CurrentThread.Name = "主线程";}void Calc(){Console.WriteLine(Thread.CurrentThread.Name+"开始执行");int sum= 0;for (int i = 0; i <=300; i++){Thread.Sleep(1);sum += i;}//需要使用启动并调试查看错误//System.InvalidOperationException:“线程间操作无效: 从不是创建控件“label1”的线程访问它。”//因为lable1空间是由主线程创建的,分线程不能去操作他//分线程不能操作UI(窗体,控件)label1.Text = $"1-300之间的数字的和是{sum}";}private void button1_Click(object sender, EventArgs e){Calc();}private void button2_Click(object sender, EventArgs e){ThreadStart threadStart = new ThreadStart(Calc);Thread thread =new Thread(threadStart);thread.Name = "分线程";thread.Start();}}
}

线程通讯_分传主

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace _03_线程通讯_分传主
{public partial class Form1 : Form{//1.定义一个变量存储主线程的执行期上下文SynchronizationContext mainContent;public Form1(){InitializeComponent();Thread.CurrentThread.Name = "主线程";}void Fn(){Console.WriteLine(Thread.CurrentThread.Name);Thread.Sleep(3000);//4.分线程调用方法,给主线程传递数据mainContent.Post(Abc, "我是分线程计算的结果");}private void button1_Click(object sender, EventArgs e){//2.设置变量存储当前主线程的执行期上下文mainContent = SynchronizationContext.Current;//ThreadStart threadStart = new ThreadStart(Fn);// Thread thread = new Thread(threadStart);//thread.Name = "分线程";//thread.Start();//启动分线程执行耗时任务//3.启动分线程让他执行耗时任务new Thread(new ThreadStart(Fn)) { Name = "分线程" }.Start();}//5.定义函数,当分线程发送数据的时候执行void Abc(object o){//函数的参数就是第4步调用函数的时候传递的第二个参数Console.WriteLine(o);Console.WriteLine("Abc"+Thread.CurrentThread.Name);//主线程label1.Text=o.ToString();}}
}

线程通讯_主传分

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace _04_线程通讯_主传分
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Calc(object obj){Console.WriteLine("obj:"+obj);int sum = 0;for (int i = 0; i < Convert.ToInt32(obj); i++){Thread.Sleep(1);sum += i;}//sum 和   需要显示在ui界面上//在分线程中操作ui页面//参数是一个委托类型Invoke(new Action(() =>{label1.Text = $"1-{obj}的和为:{sum}";}));}private void button1_Click(object sender, EventArgs e){//主线程// Calc();// ThreadStart  没有参数的函数类型//1.创建接收参数的委托//ParameterizedThreadStart ts = new ParameterizedThreadStart(Calc);2.创建线程//Thread thread = new Thread(ts);//thread.Name = "分线程";3.执行线程//thread.Start(100);//调用Start方法的时候传递参数即可//简写形式://注意:如果分线程执行的任务方法要接收参数,只能接收object类型,调用Start方法的时候传递参数即可new Thread(Calc).Start(100);}private void button2_Click(object sender, EventArgs e){new Thread(Calc).Start(200);}private void button3_Click(object sender, EventArgs e){new Thread(Calc).Start(300);}}
}

关闭线程

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace _05_关闭线程
{public partial class Form1 : Form{public Form1(){InitializeComponent();}void Fn(){Thread.Sleep(1000);Console.WriteLine("1秒过去了");Thread.Sleep(1000);Console.WriteLine("2秒过去了");Thread.Sleep(1000);Console.WriteLine("3秒过去了");Thread.Sleep(1000);Console.WriteLine("4秒过去了");}Thread thread;private void button1_Click(object sender, EventArgs e){//Start() //开启线程thread=  new Thread(Fn);thread.Start();}private void button3_Click(object sender, EventArgs e){// Abort() 销毁线程//线程将会在他任务执行完成之后被自动销毁,也可以手动销毁thread.Abort();}}
}

线程锁

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace _06_线程锁
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){new Thread(Fn1).Start();new Thread(Fn2).Start();new Thread(Fn3).Start();}void Fn1(){Thread.Sleep(100);Invoke(new Action<string>(changUi), "我是我1号线程修改的内容");}void Fn2(){Thread.Sleep(100);Invoke(new Action<string>(changUi), "我是我2号线程修改的内容");}void Fn3(){Thread.Sleep(100);Invoke(new Action<string>(changUi), "我是我3号线程修改的内容");}void changUi(Object value){label1.Text=value.ToString();}//每次点击按钮lable都显示不同的文本,因为不同的线程执行的先后顺序不一定相同//执行完成的时刻也不一定相同,因此我们无法掌控某个线程执行的实际,// 上面是哪个线程谁都可以先执行完毕,也有可能同时执行完毕//1.创建一个锁(锁一般是一个引用类型)private static readonly object key =new object();//多个线程操作一个变量,导致我们的判断无法进行限制int apple;private void button2_Click(object sender, EventArgs e){apple = 1;new Thread(WuyifanEat).Start();new Thread(LuozhxiangEat).Start();}void WuyifanEat(){Console.WriteLine("吴亦凡吃苹果,去看看还有没有");//2.使用锁将代码锁起来,(互斥的,相互排斥的锁,当锁关闭的时候,另一个位置无法进入)lock (key){if (apple <= 0){Console.WriteLine("吴亦凡:没有苹果了,不吃了");return;}Thread.Sleep(100);apple--;}Console.WriteLine($"吴亦凡吃完了,现在还剩{apple}个苹果");Thread.Sleep(2000);Console.WriteLine("吴亦凡吃完了");}void LuozhxiangEat(){Console.WriteLine("罗志祥吃苹果,去看看还有没有");lock (key){if (apple <= 0){Console.WriteLine("罗志祥:没有苹果了,不吃了");return;}Thread.Sleep(100);apple--;}Console.WriteLine($"罗志祥吃完了,现在还剩{apple}个苹果");Thread.Sleep(2000);Console.WriteLine("罗志祥吃完了");}}
}

使用锁的注意事项
1、lock锁括号中使用的锁必须是引用类型,string除外
2、推荐锁使用静态的、私有的、只读的对象
3、我们的锁一定要保证不会被对象的外部所操作才有意义,否则就有可能被手动上锁造成死锁

注意:不要使用字符串当锁,因为这个操作很危险,因为字符串被公共语言运行库(CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。
例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。
出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。而且lock(this)只对当前对象有效,如果多个对象之间就达不到同步的效果。
lock(typeof(Class))与锁定字符串一样,范围太广了。

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

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

相关文章

移除元素Java实现

题意 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 额外空间 并 原地 修改数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元…

websocket实践

文章目录 背景WebSocket API使用场景优点 实例步骤 1: 设置 WebSocket 服务器步骤 2: 创建客户端 HTML 页面步骤 3: 测试 WebSocket 通信注意事项实际操作 参考资料 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得浏览器和服务器只需建立一个连接&#xff0c;…

CSS:filter属性介绍

一、filter属性简介 值描述示例blur(Npx)设置高斯模糊效果。N是模糊半径&#xff0c;值越大&#xff0c;模糊效果越明显。filter: blur(5px);brightness(%)调整图像的亮度。百分比值小于100%会使图像变暗&#xff0c;大于100%会使图像变亮。filter: brightness(75%);contrast(…

el-table合计行添加按钮操作

针对于el-table中合计功能中的操作栏也可以按钮&#xff0c;并且可以添加点击事件 ElTable源码里footer部分是&#xff0c;这种方式渲染的&#xff0c;也就是 支持传递VNode。使用h第一个参数传递 组件&#xff0c;可以把组件转成VNode&#xff0c;比如现在要在右下角加一个 详…

无货源,0基础做电商,6个选品逻辑快速出单!

首先我们要先解决货源问题&#xff0c;再来谈选品逻辑。初入电商行业&#xff0c;进货渠道建议使用1688。首先1688是国内最大的B2B批发平台&#xff0c;平台服务和安全性都提供了一定的保障&#xff0c;以及丰富的货源选择。你可以浏览不同供应商的产品&#xff0c;对比价格、质…

11.java openCV4.x 入门- Imgcodecs之图像读写

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天建议把本文当作笔记来看&#xff0c;据说专栏目录里面有相应视频&#x1f92b; &#x1f9ed;文…

如何关闭WordPress的自动更新功能

Wordpress为什么自动更新 WordPress自动更新是为了提供更好的安全性和稳定性。 安全性&#xff1a;WordPress是一个广泛使用的内容管理系统&#xff0c;因此成为恶意攻击的目标。WordPress的自动更新功能确保你的网站及时获得最新的安全补丁和修复程序&#xff0c;以保护你的网…

【智能优化算法】基于领导者优化的哈里斯鹰优化算法(LHHO)

01.引言 基于领导者优化的哈里斯鹰优化算法leader Harris hawks optimization (LHHO)&#xff0c;以增强Harris hawks optimization (HHO)的搜索能力。通过在探索阶段的适应性栖息和每一代哈里斯鹰的基于领导者的突变选择&#xff0c;可以实现更多的探索。使用经典的23个基准函…

跑模型——labelme的json文件转成yolo使用的txt文件(语义分割)

前言 将labelme多边形标注的json文件转换成yolo使用的txt文件 import os import json import numpy as np from tqdm import tqdm#实现函数 def json2txt(path_json, path_txt): # 可修改生成格式with open(path_json, r) as path_json:jsonx json.load(path_json)with open…

Flink常见面试问题(附答案)

目录 基础篇1. 什么是Apache Flink&#xff1f;2. Flink与Hadoop的区别是什么&#xff1f;3. Flink中的事件时间&#xff08;Event Time&#xff09;和处理时间&#xff08;Processing Time&#xff09;有什么区别&#xff1f;4. Flink的容错机制是如何实现的&#xff1f;5. 什…

node.js 包管理工具介绍 (npm与Yarn详细说明)

一、什么是包&#xff1f; 包&#xff08;package&#xff09;代表了一组特定功能的源码集合 二、什么是包管理工具&#xff1f; 也就是管理包的应用软件&#xff0c;可以对包进行下载、更新、删除、上传等操作。借助包管理工具&#xff0c;可以快速开发项目提升开发效率。包…

4.2.4 理解路由器数据包过程

1、实验目的 通过本实验可以掌握&#xff1a; 了解IP路由原理了解数据包封装和解封装的概念了解路由器路由和交换过程 2、实验拓扑 观察路由器路由数据包过程的实验拓扑如图4-3所示&#xff0c;设备接口地址信息如表4-2所示。 图4-3 观察路由器路由数据包过程的实验拓扑 本…

用Python编写GUI程序实现WebP文件批量转换为JPEG格式

在Python编程中&#xff0c;经常会遇到需要处理图片格式的情况。最近&#xff0c;我遇到了一个有趣的问题&#xff1a;如何通过编写一个GUI程序来实现将WebP格式的图片批量转换为JPEG格式&#xff1f;在这篇博客中&#xff0c;我将分享我使用Python、wxPython模块和Pillow库实现…

linux系统离线安装nginx

perlnginx是一个高性能的http和反向代理服务器&#xff0c;并发能力很强&#xff0c;一般用来做负载均衡比较多&#xff0c;分布式系统开发中用作web服务器。 一、下载 地址&#xff1a;nginx: download 我们下载这个稳定版本 二、环境依赖检查 nginx安装需要很多外部依赖&…

浅拷贝和深拷贝

1、两者区别&#xff1a; 首先对于一个对象中的基本数据类型&#xff0c;来做浅拷贝和深拷贝其实没有什么区别&#xff0c;都是将原始值复制一份给新的对象&#xff0c;但是对于对象中的引用数据类型来说&#xff0c;浅拷贝只是将引用数据类型的地址值复制一份给新的对象&#…

python开发poc,fofa爬虫批量化扫洞

学习使用python做到批量化的漏洞脚本 1.通过fofa搜索结果来采集脚本 2.批量化扫描漏洞 ---glassfish存在任意文件读取在默认48484端口&#xff0c;漏洞验证的poc为: "glassfish" && port"4848" && country"CN" http://loca…

Sybase ASE中的char(N)的坑以及与PostgreSQL的对比

1背景 昨天,一朋友向我咨询Sybase ASE中定长字符串类型的行为,说他们的客户反映,同样的char类型的数据,通过jdbc来查,Sybase库不会带空格,而PostgreSQL会带。是不是这样的?他是PostgreSQL的专业大拿,但因为他手头没有现成的Sybase ASE环境,刚好我手上有,便于一试。 …

flutter 安卓打包自定义名字

打包的名字如 app.1.0.1_relase_201283893.apk 实现 配置安卓项目的中的build.gradle &#xff08;android/app/build.gradle &#xff09; 新增 android { 内 applicationVariants.all { variant ->variant.outputs.all {def appName "拓车服管家" // 文件名…

Python实现读取dxf文件的所有字符

Python实现读取dxf文件的所有字符 import ezdxfdef read_dxf_and_print_text(filename):# 加载DXF文件doc ezdxf.readfile(filename)# 遍历所有的实体for entity in doc.entities:# 检查实体是否是TEXT、MTEXT或DIMENSIONif isinstance(entity, ezdxf.entities.Text):print(f…

SparkBug解决:Type mismatch; found : org.apache.spark.sql.Column required: Double

def assginFlag(aizmuth:Double):Option[Int] {val interval 0.5val index (aizmuth / interval ).toIntif (index > 0 && index < 720 ) Some(index 1) else None} assginFlag方法中的条件判断条件 (index > 0 && index < 720) 返回的是一个布…