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


    一、线程初始化

    1.无参数

    1. static void Main(string[] args) {
    2. //第一种写法
    3. Thread thread = new Thread(test);
    4. thread.Start();
    5. //第二种写法 delegate
    6. Thread thread1 = new Thread(new ThreadStart(test));
    7. thread1.Start();
    8. //第三种写法 lambda
    9. Thread thread2 = new Thread(() => { test(); });
    10. thread2.Start();
    11. Console.WriteLine("mainThread");
    12. Console.Read();
    13. }
    14. static void test() {
    15. Console.WriteLine("hello");
    16. }

    2.有参数

    1. static void Main(string[] args) {
    2. object obj = "xxx";
    3. //第一种写法
    4. Thread thread = new Thread(test);
    5. thread.Start(obj);
    6. //第二种写法 delegate
    7. Thread thread1 = new Thread(new ParameterizedThreadStart(test));
    8. thread1.Start(obj);
    9. //第三种写法 lambda
    10. Thread thread2 = new Thread((arg) => { test(arg); });
    11. thread2.Start(obj);
    12. Console.WriteLine("mainThread");
    13. Console.Read();
    14. }
    15. static void test(object obj) {
    16. Console.WriteLine("hello" + obj);
    17. }

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

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

    二、线程开启

    1.无参数传递

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4. using System.Threading;
    5. namespace AAAAAA
    6. {
    7. class AAA
    8. {
    9. public static void Main()
    10. {
    11. Thread t = new Thread(new ThreadStart(A));
    12. t.Start();
    13. Console.Read();
    14. }
    15. private static void A()
    16. {
    17. Console.WriteLine("Method A!");
    18. }
    19. }
    20. }

    运行结果:Method A!

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

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

    2.单个参数传递

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4. using System.Threading;
    5. namespace AAAAAA
    6. {
    7. class AAA
    8. {
    9. public static void Main()
    10. {
    11. Thread t = new Thread(new ParameterizedThreadStart(B));
    12. t.Start("B");
    13. Console.Read();
    14. }
    15. private static void B(object obj)
    16. {
    17. Console.WriteLine("Method {0}!",obj.ToString ());
    18. }
    19. }
    20. }

    运行结果:Method B! 

    3.多个参数传递

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

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4. using System.Threading;
    5. namespace AAAAAA
    6. {
    7. class AAA
    8. {
    9. public static void Main()
    10. {
    11. My m = new My();
    12. m.x = 2;
    13. m.y = 3;
    14. Thread t = new Thread(new ThreadStart(m.C));
    15. t.Start();
    16. Console.Read();
    17. }
    18. }
    19. class My
    20. {
    21. public int x, y;
    22. public void C()
    23. {
    24. Console.WriteLine("x={0},y={1}", this.x, this.y);
    25. }
    26. }
    27. }

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

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

    1. //结构体
    2. struct RowCol
    3. {
    4. public int row;
    5. public int col;
    6. };
    7. //定义方法
    8. public void Output(Object rc)
    9. {
    10. RowCol rowCol = (RowCol)rc;
    11. for (int i = 0; i < rowCol.row; i++)
    12. {
    13. for (int j = 0; j < rowCol.col; j++)
    14. Console.Write("{0} ", _char);
    15. Console.Write("\n");
    16. }
    17. }

    三、常用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); //另开线程开始,带参数

    主要介绍三个方法:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading;
    6. using System.Threading.Tasks;
    7. namespace 线程test1005
    8. {
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. Thread tt = new Thread(test);
    14. tt.Start();
    15. for (int i = 0; i < 300; i++)
    16. {
    17. Console.Write(2);
    18. }
    19. Console.Read();
    20. }
    21. static void test()
    22. {
    23. for (int i = 0; i < 300; i++)
    24. {
    25. Console.Write(1);
    26. }
    27. }
    28. }
    29. }

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

    1. static void Main(string[] args)
    2. {
    3. Thread tt = new Thread(test);
    4. tt.Start();
    5. tt.Abort();
    6. for (int i = 0; i < 300; i++)
    7. {
    8. Console.Write(2);
    9. }
    10. Console.Read();
    11. }

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

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

    2.thread.ResetAbort用法

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading;
    6. using System.Threading.Tasks;
    7. namespace 线程test1005
    8. {
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. Thread tt = new Thread(test);
    14. tt.Start();
    15. Thread.Sleep(10);
    16. for (int i = 0; i < 300; i++)
    17. {
    18. Console.Write(2);
    19. }
    20. tt.Abort();
    21. Console.Read();
    22. }
    23. static void test()
    24. {
    25. try
    26. {
    27. while (true)
    28. {
    29. for (int i = 0; i < 300; i++)
    30. {
    31. Console.Write(1);
    32. }
    33. }
    34. }
    35. catch (Exception ex)
    36. {
    37. Console.WriteLine("子线程");
    38. Thread.ResetAbort();
    39. }
    40. finally
    41. {
    42. Console.WriteLine("这里是finally");
    43. }
    44. Console.WriteLine("最后");
    45. }
    46. }
    47. }

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

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

    3.thread.join用法

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading;
    6. using System.Threading.Tasks;
    7. namespace 线程test1005
    8. {
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. Thread tt = new Thread(test);
    14. tt.Start();
    15. tt.Join();
    16. for (int i = 0; i < 300; i++)
    17. {
    18. Console.Write(2);
    19. }
    20. tt.Abort();
    21. Console.Read();
    22. }
    23. static void test()
    24. {
    25. for (int i = 0; i < 300; i++)
    26. {
    27. Console.Write(1);
    28. }
    29. }
    30. }
    31. }

    运行结果:

    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博客

  • 相关阅读:
    h5播放m3u8格式的视频
    Java 图像处理(一)
    openEuler快速入门-Navicat远程链接openGauss数据库
    亚马逊卖家测评为什么一定要掌握自养号技巧
    CH341应用升级为CH347软硬件注意事项
    《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(9)-Charles如何修改请求参数和响应数据-上篇
    SpringCloud复习:(2)@LoadBalanced注解的工作原理
    flutter开发web应用支持浏览器跨域设置
    IO作业:readdir、closedir、opendir、要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l
    单例模式 (Singleton)
  • 原文地址:https://blog.csdn.net/qiaodahua/article/details/133650269