基本技能训练之线程
Posted C_supreme
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本技能训练之线程相关的知识,希望对你有一定的参考价值。
这段时间看了金旭亮老师的软件开发三部曲的基本技能训练课程。现在总结一下关于C#线程方面的知识,加深一下印象,再梳理一下知识。
现在主流的操作系统都支持多任务并行执行,而线程就是操作系统分配CPU的基本单元
可以把分割出来的工作任务封装成线程函数,由线程负责执行。线程的运行过程就体现为线程函数的执行过程。
1.线程的构造函数
public Thread(ThreadStart start); public Thread(ParameterizedThreadStart start);
线程的构造函数由两种,一种是ThreadStart 是一个不带参数,没有返回类型的委托
另一种就是ParameterizedThreadStart,是一个带一个Object的参数,同样没有返回类型的委托。这两个委托都是用来挂接外部的方法,当线程运行是就会执行该函数
public delegate void ThreadStart(); public delegate void ParameterizedThreadStart(object obj);
2.线程对象的创建的三种方法与执行
C#线程类 Thread--不带参数的方法
public void ThreadMethod()//用来被线程调用的方法 { //方法内部代码 } static void Main() { //ThreadStart 是一个没有参数,没有返回值的委托,用来挂接被线程调用的方法 Thread th = new Thread(new ThreadStart(ThreadMethod));//创建一个线程对象 th.Start();//调用Start方法运行线程 }
C#线程类 Thread--带object参数的方法
public void RefreshLable(object infoValue) { Action<string> del = (string info) => { //方法内部代码 }; } static void Main() { Thread th = new Thread(RefreshLable); th.Start(obj);//在调用Start方法时传入一个Object类型的参数 这个参数会传入执行方法中 }
3.线程的终止
在线程函数中可以使用Thread.CurrentThread可获取负责执行此函数的线程对象的引用
使用Abort方法提前终止线程 但是要注意 在线程方法里要try catch一下,然后调用ReSetAbort方法 否则CLR会抛出异常
class Program { static void Main(string[] args) { System.Console.WriteLine("主线程开始"); //创建线程对象 MyThread obj = new MyThread(); Thread th = new Thread(obj.SomeLongTask); th.IsBackground = true; th.Start();//启动线程 Thread.Sleep(300); //主线程休眠0.3秒 System.Console.WriteLine("主线程调用Abort方法提前中止辅助线程……"); th.Abort(); //提前中止线程 System.Console.WriteLine("主线程结束"); Console.ReadKey(); } } class MyThread { public void SomeLongTask() { try { System.Console.WriteLine("辅助线程开始..."); for (int i = 0; i < 10; i++) { System.Console.WriteLine(i); Thread.Sleep(200); } } catch (ThreadAbortException e) { System.Console.WriteLine("辅助线程被提前中断:{0}", e.Message); Thread.ResetAbort(); //不加此句,CLR会再次抛出ThreadAbortException,从而导致函数最后一句代码不会执行。 } finally { System.Console.WriteLine("完成清理辅助线程占用的资源工作"); } //如果前面没有Thread.ResetAbort(),则程序流程不会执行到此句。 System.Console.WriteLine("辅助线程结束"); } }
4.背景线程
IsBackgruoud属性设置为true表示线程为背景线程,当一个线程被设置为背景线程之后,当主线程一结束,背景线程也会自动中断
默认情况下IsBackgruoud属性为false,成为前台线程,CLR会等待所有的前台线程结束后才会结束整个进程
5.Join方法
th调用Join方法后,主线程会在此处等待,直到th线程执行完毕,主线程才会继续执行
static void Main(string[] args) { Console.WriteLine("主线程开始运行"); Thread th = new Thread(new ThreadStart(ThreadAMethod)); th.Start(); th.Join(); Console.WriteLine("主线程退出"); Console.ReadKey(); }
6.线程状态
线程属于进阶部分,也是非常重要的一部分,我学起来感觉有些地方还是有些难度,但是很有意思。多线程的程序很难调试,下断点之后会因为启动其他的线程而很难追踪。这是我刚刚接触多线程开发之后的初步感觉。
此前一直想学习多线程,但是C#图解教程上直接就讲async 和await关键字,感觉不是最基础的多线程学习,所以一直迟迟没有学习,直到看到了金老师的课程。很开心,也很紧迫,因为很快就要面临实习和就业但是还是感觉自己的知识储备不够。要继续加油奋斗!!
以上是关于基本技能训练之线程的主要内容,如果未能解决你的问题,请参考以下文章
深度学习基本功2:网络训练小技巧之使用预训练权重冻结训练和断点恢复
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段
大厂面试之JAVA核心技能:Slipped Conditions