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.mzph.cn/news/97713.shtml

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

相关文章

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提升提出了更高的要求。 二、企业通过数字化转型&#xff0c;不仅有利于优化业务流程、提升经营管理…

LeakyReLU激活函数

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

应用安全系列之四十:登录常见问题以及预防方法

对于所有系统而言,登录是一个必备的而且最重要的功能。随着系统越来越复杂,服务越来越多,为了方便用户使用系统的服务,SSO应运而生,SSO虽然方便了用户使用系统,也增加了风险。因为一旦登录出现问题,就很容易通过登录访问整个系统。可见,对于登录如果没有控制好,攻击者…

Git使用【中】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;分支管理分支概念git branch&#xff08;查看/删除分…

【数组】二分查找(减不减一,看初始化!)

一、力扣习题链接 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 二、思路 这道题目的前提是数组为有序数组&#xff0c;同时题目还强调数组中无重复元素&#xff0c;因为一旦有重复元素&#xff0c;使用二分查找法返回的元素下标可能不是唯一的&#xff0c;这些都是…

复旦大学EMBA:揭秘科创企业,领略未来战略!

智能制造&#xff0c;国之重器。作为制造强国建设的主攻方向&#xff0c;智能制造的发展水平关系到我国未来制造业在全球的地位与影响力。发展智能制造&#xff0c;是加快建设现代化产业体系的重要手段&#xff0c;提升供给体系适配性的有力抓手&#xff0c;也是建设数字中国的…

css的gap设置元素之间的间隔

在felx布局中可以使用gap来设置元素之间的间隔&#xff1b; .box{width: 800px;height: auto;border: 1px solid green;display: flex;flex-wrap: wrap;gap: 100px; } .inner{width: 200px;height: 200px;background-color: skyblue; } <div class"box"><…

基于SSM的固定资产管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

ROS2 Galactic安装

ROS2 Galactic安装 ROS2 Galactic安装字体编码检查添加ros2仓库到本机安装ROS2系统测试ROS卸载ros2 ROS2 Galactic安装 字体编码检查 安装需要设置本级为UTF-8字体&#xff0c;使用如下指令检查&#xff1a; locale # check for UTF-8sudo apt update && sudo apt …

Acwing.886 求组合数Ⅱ

题目 给定n组询问&#xff0c;每组询问给定两个整数a&#xff0c; b&#xff0c;请你输出 的值。 输入格式 第一行包含整数n。 接下来n行&#xff0c;每行包含—组a和b。 输出格式 共n行&#xff0c;每行输出—个询问的解。 数据范围 1<n≤10000, 1 <b<a≤105…

《C和指针》笔记31:多维数组的数组名、指向多维数组的指针、作为函数参数的多维数组

文章目录 1. 指向多维数组的数组名2. 指向多维数组的指针3. 作为函数参数的多维数组 1. 指向多维数组的数组名 我们知道一维数组名的值是一个指针常量&#xff0c;它的类型是“指向元素类型的指针”&#xff0c;它指向数组的第1个元素。那么多维数组的数组名代表什么呢&#x…

点餐小程序实战教程06-首页开发

用户注册功能开发好了之后&#xff0c;我们就要开发小程序&#xff0c;首先我们是规划小程序的功能模块&#xff0c;我们一共是四个模块&#xff0c;分别是首页、订单、消息和我的。 首页我们主要是点餐的功能&#xff0c;可以选择菜品&#xff0c;加入到购物车&#xff0c;然…

Flink---10、处理函数(基本处理函数、按键分区处理函数、窗口处理函数、应用案例TopN、侧输出流)

星光下的赶路人star的个人主页 我的敌手就是我自己&#xff0c;我要他美好到能使我满意的程度 文章目录 1、处理函数1.1 基本处理函数&#xff08;ProcessFunction&#xff09;1.1.1 处理函数的功能和使用1.1.2 ProcessFunction解析1.1.3 处理函数的分类 1.2 按键分区处理函数&…

剑指offer——JZ34 二叉树中和为某一值的路径(二) 解题思路与具体代码【C++】

一、题目描述与要求 二叉树中和为某一值的路径(二)_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入一颗二叉树的根节点root和一个整数expectNumber&#xff0c;找出二叉树中结点值的和为expectNumber的所有路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过…

“国产版”的chatgpt国内用户的更优选择!一定要收藏!

众所周知&#xff0c;chatGPT没有对国内开放使用权限&#xff0c;因此国内的用户是不可以使用直接使用chatgpt的&#xff0c;部分朋友想要通过使用网络工具使用其对话服务&#xff0c;这种行为显然是不可取的。其实也有好用的国产版的chatGPT网站&#xff0c;只是大家可能之前没…

深度学习实战基础案例——卷积神经网络(CNN)基于MobileNetV3的肺炎识别|第3例

文章目录 前言一、数据集介绍二、前期工作三、数据集读取四、构建CA注意力模块五、构建模型六、开始训练 前言 Google公司继MobileNetV2之后&#xff0c;在2019年发表了它的改进版本MobileNetV3。而MobileNetV3共有两个版本&#xff0c;分别是MobileNetV3-Large和MobileNetV2-…

【 构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!】

构建maven工程时&#xff0c;配置了阿里云的前提下&#xff0c;依旧使用中央仓库下载依赖导致失败的问题&#xff01;&#xff01;&#xff01; 错误提示信息: Cannot download ZIP distribution from https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3…

性能监控-微服务链路追踪skywalking搭建

中文文档&#xff1a;hong设置 (skyapm.github.cio) 参考:微服务链路追踪SkyWalking的介绍和部署_skywalking部署_技术闲聊DD的博客-CSDN博客 参考&#xff1a;链路追踪SkyWalking整合项目以及数据持久化_skywalking 持久化_技术闲聊DD的博客-CSDN博客 Liunx部署skywalking以…

云服务仿真:完全模拟 AWS 服务的本地体验 | 开源日报 No.45

localstack/localstack Stars: 48.7k License: NOASSERTION LocalStack 是一个云服务仿真器&#xff0c;可以在您的笔记本电脑或 CI 环境中以单个容器运行。它提供了一个易于使用的测试/模拟框架&#xff0c;用于开发云应用程序。主要功能包括&#xff1a; 在本地机器上完全…

Spring框架(中)

1、基于注解管理Bean&#xff1a; 1、开启组件扫描&#xff1a; Spring 默认不使用注解装配 Bean&#xff0c;因此我们需要在 Spring 的 XML 配置中&#xff0c;通过 context:component-scan 元素开启 Spring Beans的自动扫描功能。开启此功能后&#xff0c;Spring 会自动从扫…