基本技能训练之线程

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

大厂面试之JAVA核心技能:Slipped Conditions

大厂面试之JAVA核心技能:Slipped Conditions