C# 線程(二)——Thread學習


背景:
在.NET Framework1.0時代就誕生了Thread,也有大量相關的Api支持,thread創建是前台線程
缺陷:
1、一次使用一個線程來創建刪除線程,線程的創建和銷毀對系統開銷比較大
2、在高並發的場景,大量線程創建、銷毀會降低響應性能
 
一、構造方法
1.1帶參數的委托的構造方法——Thread(ParameterizedThreadStart)
ParameterizedThreadStart構造方法,定義:public delegate void ParameterizedThreadStart(object? obj)帶參數的Action委托
public static void Dosomething(object? word)
        {
            Console.WriteLine(word.ToString());
        }
                ParameterizedThreadStart ps = new ParameterizedThreadStart(Dosomething);
                Thread thread1 = new Thread(ps);
                thread1.Start("埃里克多");

1.2不帶參數的構造方法——Thread(ThreadStart)

ThreadStart構造方法,定義:public delegate void ThreadStart();

ThreadStart ts = new ThreadStart(Dothing);
                Thread thread2 = new Thread(ts);
                thread2.Start();
       public static void Dothing()
        {
            Console.WriteLine("這是個無參數的方法。。。。");
        }

 

二、相關屬性及方法

        Thread.Start():啟動線程的執行;

  Thread.Suspend():掛起線程,或者如果線程已掛起,則不起作用;

  Thread.Resume():繼續已掛起的線程;

  Thread.Interrupt():中止處於 Wait或者Sleep或者Join 線程狀態的線程;

  Thread.Join():阻塞調用線程,直到某個線程終止時為止

  Thread.Sleep():將當前線程阻塞指定的毫秒數,此時線程處於休眠狀態,期間此線程不再得到系統分配的執行時間片。

  Thread.Abort():以開始終止此線程的過程。

2.1線程的執行是無序的

                  DisorderVerify();
                //多次執行后會得到下面兩種結果
                //結果一:
                //Thread_2 is start
                //Thread_1 is start
                //結果二:
                //Thread_1 is start
                //Thread_2 is start
        static void DisorderVerify()
        {
            Thread thread1 = new Thread(() => Console.WriteLine("Thread_1 is start"));
            thread1.Name = "Thread_1";


            Thread thread2 = new Thread(() => Console.WriteLine("Thread_2 is start"));
            thread2.Name = "Thread_2";

            thread1.Start();
            thread2.Start();
        }

2.2 Thread.join函數

當thread1調用Join方法的時候,主線程MainThread、thread2就被停止執行,直到thread1線程執行完畢,MainThread、thread2存在交叉執行

                for (int i = 0; i < 20; i++)
                {
                    if (i == 4)
                    {
                        JoinMethodTest();
                    }
                    else
                    {
                        Console.WriteLine($"主線程執行:{i}");
                    }
                    
                }
        static void JoinMethodTest()
        {
            Thread thread1 = new Thread(() =>
            {
                for (int i = 0; i <10; i++)
                {
                    Console.WriteLine("ddd");
                }
                
            });
            Thread thread2 = new Thread(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("aaa");
                }

            });
            thread1.Start();
            thread1.Join();
            //等待thread1執行完再執行
            thread2.Start();
        }

執行結果:

                //主線程執行:1
                //主線程執行:2
                //主線程執行:3
                //ddd
                //ddd
                //ddd
                //ddd
                //ddd
                //ddd
                //ddd
                //ddd
                //ddd
                //ddd
                //主線程執行:5
                //主線程執行:6
                //主線程執行:7
                //主線程執行:8
                //主線程執行:9
                //主線程執行:10
                //主線程執行:11
                //主線程執行:12
                //主線程執行:13
                //aaa
                //aaa
                //aaa
                //aaa
                //aaa
                //aaa
                //aaa
                //aaa
                //aaa
                //aaa
                //主線程執行:14
                //主線程執行:15
                //主線程執行:16
                //主線程執行:17
                //主線程執行:18
                //主線程執行:19

 

三、前台線程及后台線程

Thread默認創建的為前台線程,可以看到當thread 為前台線程時,即使主線程執行結束,thread也會執行后程序才會結束;當threa為后台線程時,主線程執行結束,程序就結束了。

        public static void BackGroundThreadTest()
        {
            Thread thread = new Thread(() =>
            {
                Thread.Sleep(3000);
                Console.WriteLine("后台線程測試");
            });
            thread.IsBackground = true;
            thread.Start();

        }
                //后台方法測試
                BackGroundThreadTest();
                Console.WriteLine("主線程結束。。。。");
                //打印結果:
                //主線程結束。。。。

                //將方法里的thread.IsBackground = true;注釋
                //打印結果:
                //主線程結束。。。。
                //后台線程測試

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM