C#学习系列相关之多线程(二)----Thread类介绍

一、线程初始化

1.无参数


static void Main(string[] args) {//第一种写法Thread thread = new Thread(test);thread.Start();//第二种写法 delegateThread thread1 = new Thread(new ThreadStart(test));thread1.Start();//第三种写法 lambdaThread thread2 = new Thread(() => { test(); });thread2.Start();Console.WriteLine("mainThread");Console.Read();}static void test() {Console.WriteLine("hello");}

2.有参数


static void Main(string[] args) {object obj = "xxx";//第一种写法Thread thread = new Thread(test);thread.Start(obj);//第二种写法 delegateThread thread1 = new Thread(new ParameterizedThreadStart(test));thread1.Start(obj);//第三种写法 lambdaThread thread2 = new Thread((arg) => { test(arg); });thread2.Start(obj);Console.WriteLine("mainThread");Console.Read();}static void test(object obj) {Console.WriteLine("hello" + obj);}

注意:1.thread.start()内填入的是实际传递的参数,arg为形参

           2.方法test中传递的参数数量为1,并且必须是object类型

二、线程开启

1.无参数传递

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Threading;  namespace AAAAAA  
{  class AAA  {  public static void Main()  {  Thread t = new Thread(new ThreadStart(A));  t.Start();  Console.Read();  }  private static void A()  {  Console.WriteLine("Method A!");  }  }  
}

运行结果:Method A!

提示:本人准备建立一个技术交流群,会将日常学习工作中遇到的问题和解决方案进行分享,同时也会将代码和学习资料上传进去,有什么不懂的问题可以咨询我!+v:SJS66-12

生活所迫打个广告,本人也代购莆田鞋,不是中间商,工厂直接取货,价格优惠质量保证,都是我自己前去挑选,可以视频选购验货!!希望大家支持!!!赚点生活费!!!+v:SJS66-12

2.单个参数传递

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Threading;  namespace AAAAAA  
{  class AAA  {  public static void Main()  {   Thread t = new Thread(new ParameterizedThreadStart(B));  t.Start("B");  Console.Read();  }  private static void B(object obj)  {  Console.WriteLine("Method {0}!",obj.ToString ());  }  }  
}

运行结果:Method B! 

3.多个参数传递

第一种方法:将多个参数定义为类的属性,类内的方法

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Threading;  namespace AAAAAA  
{  class AAA  {  public static void Main()  {  My m = new My();  m.x = 2;  m.y = 3;  Thread t = new Thread(new ThreadStart(m.C));  t.Start();  Console.Read();  }  }  class My  {  public int x, y;  public void C()  {  Console.WriteLine("x={0},y={1}", this.x, this.y);  }  }  
}

结果显示:x=2,y=3 

第二种方法:该方法最为推荐的方法,定义结构体,通过object进行拆箱,将参数进行传递

//结构体  struct RowCol  {  public int row;  public int col;  };  //定义方法  
public void Output(Object rc)  {  RowCol rowCol = (RowCol)rc;  for (int i = 0; i < rowCol.row; i++)  {  for (int j = 0; j < rowCol.col; j++)  Console.Write("{0} ", _char);  Console.Write("\n");  }  }

三、常用Thread类下的方法

常用属性:

常用方法介绍:

1、public bool IsBackground { get; set; } //表示此线程是否为后台线程
//false为前台线程,进程结束后,任务执行完毕以后,线程才结束
//true为后台线程,进程结束,线程结束
2、public int ManagedThreadId { get; } //获取当前线程唯一标识符

3、public void Abort(); //终止线程,其实就是抛出个异常

4、public void Suspend(); //挂起也就是暂停线程 (已被弃用)

5、public void Resume(); //将挂起的线程继续,也就是回复线程 (已被弃用)

6、public void ResetAbort(); //是把终止的线程再次启用,都会有延时的

7、public void Sleep(200) ; //线程睡眠

8、public bool Join(int millisecondsTimeout); //会阻塞,必须等到线程结束后才会执行下一步
public bool Join(TimeSpan timeout); //会阻塞,必须等到线程结束后才会执行下一步

9、public static void Sleep(int millisecondsTimeout); //线程睡眠
public static void Sleep(TimeSpan timeout); //线程睡眠

10、public void Start(); //另开线程开始执行
public void Start(object parameter); //另开线程开始,带参数

主要介绍三个方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{class Program{static void Main(string[] args){Thread tt = new Thread(test);tt.Start();for (int i = 0; i < 300; i++){Console.Write(2);}Console.Read();}static void test(){for (int i = 0; i < 300; i++){Console.Write(1);}}}
}

正常运行的情况下1,2交替出现;
1.Abort用法

   static void Main(string[] args){Thread tt = new Thread(test);tt.Start();tt.Abort();for (int i = 0; i < 300; i++){Console.Write(2);}Console.Read();}

当我们加入abort后运行结果:支线程被释放

Abort相当于方法内抛出一个异常,会执行方法中catch和finally中的代码

2.thread.ResetAbort用法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{class Program{static void Main(string[] args){Thread tt = new Thread(test);tt.Start();Thread.Sleep(10);for (int i = 0; i < 300; i++){Console.Write(2);}tt.Abort();Console.Read();}static void test(){try{while (true){for (int i = 0; i < 300; i++){Console.Write(1);}}}catch (Exception ex){Console.WriteLine("子线程");Thread.ResetAbort();}finally{Console.WriteLine("这里是finally");}Console.WriteLine("最后");}}
}

可以看到线程被Abort之后,执行catch和finally块中的内容,但是不会执行finally块之后的内容。

从结果中可以看到,线程被终止了,由于执行了Thread.ResetAbort(),因此就允许继续执行finally块之后的代码。
注意: 如果Thread.ResetAbort()语句放在catch块中,最好应当把Thread.ResetAbort()语句放在catch{}代码块最后,否则会把abortException.ExceptionState中的内容给清空了。Thread.ResetAbort()还可以放在finally块中,它同样也可以允许继续执行finally块之后的代码。另外,Thread.ResetAbort()只能执行一次,不能执行二次及以上,否则会出新的异常。

3.thread.join用法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{class Program{static void Main(string[] args){Thread tt = new Thread(test);tt.Start();tt.Join();for (int i = 0; i < 300; i++){Console.Write(2);}tt.Abort();Console.Read();}static void test(){for (int i = 0; i < 300; i++){Console.Write(1);}}}
}

运行结果:

tt.join()可以先执行tt线程内的内容,等执行完成后,再执行主线程中的内容

tt.join(1000)线程会等待一段时间(10000ms),若这段时间内工作线程没挂掉,一旦超过这个时间,主线程便会开始工作

小技巧:1.abort()的功能是用来终止调用此方法的线程的,只是在多数情况下,它需要一点时间,有些延迟(可能在短时间内此线程还在执行)...
 2.join()方法它的功能不是终止线程,而是在t 线程终止之前,阻止正在结束(调用了abort()方法但还未结束)的t 线程执行,同时使主线程等待,直到t线程终止(也就是abort()方法终止过程完毕)了再执行下面的代码,打印出来的结果,执行状态就为FALSE,线程状态也为停止了。

Join常用让子线程完全终止!
 

参考文档:

C#Thread_c# thread_^命铭的博客-CSDN博客C#多线程Thread类的使用(一)_c# thread用法-CSDN博客C# Thread(线程)使用总结_c#线程一直运行-CSDN博客C# 多线程一: Thread 的简单理解与运用_c# thread-CSDN博客

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

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

相关文章

LeakyReLU激活函数

nn.LeakyReLU 是PyTorch中的Leaky Rectified Linear Unit&#xff08;ReLU&#xff09;激活函数的实现。Leaky ReLU是一种修正线性单元&#xff0c;它在非负数部分保持线性&#xff0c;而在负数部分引入一个小的斜率&#xff08;通常是一个小的正数&#xff09;&#xff0c;以防…

模拟滤波器的基础知识和设计

信号处理工作中滤波器的应用是非常广泛的&#xff0c;可以分成模拟滤波器和数字滤波器两种&#xff0c;数字滤波器主要包括两种&#xff0c;IIR和FIR&#xff0c;这两种滤波器后面统一说&#xff0c;今天先来说一说模拟滤波器&#xff08;主要是我先用Python实现了Matlab书里面…

【UE5 Cesium】15-Cesium for Unreal 加载本地地形

目录 一、加载全球无高度地形 二、加载区域DEM 效果 一、加载全球无高度地形 1. 先去如下网址下载全球无高度地形&#xff1a;Using a global terrain layer without height detail - #9 by RidhwanAziz - Cesium for Unreal - Cesium Community 下载后如下&#xff1a; 解…

MATLAB算法实战应用案例精讲-【优化算法】霸王龙优化算法(TROA)(附MATLAB代码实现)

前言 霸王龙优化算法(Tyrannosaurus optimization,TROA)由Venkata Satya Durga Manohar Sahu等人于2023年提出,该算法模拟霸王龙的狩猎行为,具有搜索速度快等优势。 霸王龙属于暴龙超科的暴龙属,是该属的唯一一种。1905年,美国古生物学家、美国艺术与科学院院士亨利奥…

【计算机视觉|人脸建模】学习从图像中回归3D面部形状和表情而无需3D监督

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Learning to Regress 3D Face Shape and Expression from an Image without 3D Supervision 链接&#xff1a;[1905.06817] Learning to Regress 3D Face Shape and Expression from an I…

2023年上半年软考网工选择题易错总结

1.固态硬盘的存储介质是( )。 A.光盘 B.闪存 C.软盘 D.磁盘 答案&#xff1a;B 解析&#xff1a; 光盘CD-ROM和软盘是塑料的,磁盘的介质是磁性金属圆盘&#xff08;附着铝合金&#xff09;&#xff0c;固态硬盘采用的存储介质是flash(闪存…

文件上传笔记

一、上传的简单绕过&#xff1a; 1、若是上传的文件只在前端的代码中进行了过滤&#xff1a; &#xff08;1&#xff09;可以直接在开发者工具中删除相关代码&#xff1a; &#xff08;2&#xff09;也可以通过 burpsuite 绕过: 上传时&#xff0c;先提前修改 php 文件的后缀…

8.2 JUC - 5.CountdownLatch

目录 一、是什么&#xff1f;二、demo演示三、应用之同步等待多线程准备完毕四、 应用之同步等待多个远程调用结束五、CountDownLatch 原理 一、是什么&#xff1f; CountdownLatch 用来进行线程同步协作&#xff0c;等待所有线程完成倒计时。 其中构造参数用来初始化等待计数…

vue3+vite+uniapp 封装一个省市区组件

一、预览图 二、使用前的一些注意事项 只支持在 uniapp vue3 项目中使用支持微信小程序和h5 (app端没有测试过)ui库用的 uview-plus省市区数据用的是 vant-ui 提供的一个赖库 vant/area-data 三、组件代码 <template><u-popup :show"show" type"botto…

iOS——仿写计算器

四则运算&#xff1a;中缀表达式转后缀表达式后缀表达式求值 实现四则运算的算法思路是&#xff1a;首先输入的是中缀表达式的字符串&#xff0c;然后将其转为计算机可以理解的后缀表达式&#xff0c;然后将后缀表达式求值&#xff1a; 中缀转后缀表达式思路参考&#xff1a;《…

现货白银图表分析的依据

现货白银的行情图表分析其实与股票的差不多&#xff0c;投资者可以结合均线、k线的变化&#xff0c;来分析实时的行情走势。当走势图的均线呈多头排列&#xff0c;即短期、中期、长期均线依次从上到下排列并向右上方运行&#xff0c;且白银价格沿各均线向右上方拉升&#xff0c…

数据产品读书笔记——认识数据产品经理

&#x1f33b;大家可能听说的更多是产品经理这个角色&#xff0c;对数据产品经理可能或多或少了解一些&#xff0c;但又不能准确的描述数据产品经理的主要职能和与其他产品的不同&#xff0c;因此通过读一些书来对数据产品经理有一个准确且全面的认知。 目录 1. 数据的产品分类…

基于生物地理学优化的BP神经网络(分类应用) - 附代码

基于生物地理学优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于生物地理学优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.生物地理学优化BP神经网络3.1 BP神经网络参数设置3.2 生物地理学算法应用 4…

Vue中如何进行图像识别与人脸对比(如百度AI、腾讯AI)

Vue中的图像识别与人脸对比 在现代Web应用程序中&#xff0c;图像识别和人脸对比技术越来越受欢迎。它们可以用于各种用途&#xff0c;如人脸识别门禁系统、图像分类和验证等。百度AI和腾讯AI是两个流行的人工智能平台&#xff0c;它们提供了强大的图像识别和人脸对比API。本文…

Sketch for mac v98.3(ui设计矢量绘图)

Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员&#xff0c;帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面&#xff0c;以及丰富的功能集&#xff0c;使得用户可以轻松地创建、编辑和共享精美的…

【华为OD机考】统计监控、需要打开多少监控器(JAVA题解——也许是全网最优)

前言 本人是算法小白&#xff0c;甚至也没有做过Leetcode。所以&#xff0c;我相信【同为菜鸡的我更能理解作为菜鸡的你们的痛点】。 题干 OD&#xff0c;B 卷 100 分题目【OD 统一考试&#xff08;B 卷&#xff09;】 1. 题目描述 某长方形停车场每个车位上方都有一个监控…

Kafka快速实战以及基本原理详解

这一部分主要是接触 Kafka &#xff0c;并熟悉 Kafka 的使用方式。快速熟练的搭建 kafka 服务&#xff0c;对于快速验证一些基于Kafka 的解决方案&#xff0c;也是非常有用的。 一、 Kafka 介绍 ChatGPT 对于 Apache Kafka 的介绍&#xff1a; 1 、 MQ 的作用 MQ &#xff1a;…

网络原理 - 详解

一&#xff0c;网络通信基础 1.1 IP地址 描述一个设备在网络上的地址&#xff0c;一般使用4个0~255之间的数字&#xff0c;并且使用三给 . 进行分割&#xff0c;如&#xff1a;127.0.0.0 1.2 端口号 端口号是一个2个字节的整数&#xff0c;用来区分一个主机上的不同应用程序…

No168.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Docker linux 安装

sudo yum update sudo yum clean all sudo yum makecache#安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 #添加官方存储库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo#安装-跳过一些异常依赖…