C#多線程的用法2-線程的生命周期


對於線程而言有兩種類型:前台線程,后台線程。前台與后台線程性質相同,但終止條件不同。

后台線程:在運行過程中如果宿主進程結束,線程將直接終止執行;在強制終止時,線程即終止執行不論線程代碼是否執行完畢。

前台線程:在運行過程中如果宿主進程結束,線程將繼續執行直至線程代碼執行完畢;在強制終止時,線程即結束不論線程代碼是否執行完畢。

后台線程生命周期:

上圖顯示:只要宿主進程結束,后台線程必定結束

上圖顯示:后台線程功能執行完畢或被強行終止即進入結束狀態,此時宿主進程並未結束

 

-----------------------------------------------------------------------------------------------------------------

前台線程生命周期:

上圖顯示:前台線程功能執行完畢或被強行終止即進入結束狀態,此時宿主進程並未結束

上圖顯示:宿主進程執行完畢,但前台線程功能未執行完畢的情況下,線程將不再依賴進程繼續執行,直到代碼執行完畢

private static void MultiThreadLifecycle()
        {
            ParameterizedThreadStart task = (sleep) =>
            {
                int i = Convert.ToInt32(sleep);
                try
                {
                    for (var i = 0; i < 10; i++)
                    {
                        Console.WriteLine(String.Format("Thread {0} Out:{1}", Thread.CurrentThread.Name, i));
                        Thread.Sleep(i);
                    }
                    Console.WriteLine(String.Format("Sub Thread {0} The End", Thread.CurrentThread.Name));

                }
                catch (ThreadAbortException ex)
                {
                    Console.WriteLine(String.Format("Sub Thread {0} Abort", Thread.CurrentThread.Name));
                }
            };

            Console.WriteLine("Main Thread");
            Thread thread1 = new Thread(task)
            {
                Name = "thread1"
            };
            Thread thread2 = new Thread(task)
            {
                Name = "thread2",
                IsBackground = true
            };
            thread1.Start(5000);

            thread2.Start(5000);

            Console.WriteLine("Main Thread Wait Sub Thread");
            thread1.Abort();
            Console.ReadLine();
            Console.WriteLine(String.Format("{0}:{1},{2}:{3}",
                thread1.Name,
                thread1.ThreadState,
                thread2.Name,
                thread2.ThreadState));
        }

說明:

1、設置現成是否為后台線程,可通過線程對象的 IsBackground 屬性設置

2、強制終止線程可通過線程對象的Abort()方法進行,同時應該在線程中進行 ThreadAbortException 異常處理,因為在強制結束未執行完成的線程時會拋出該異常。


免責聲明!

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



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