1. 程式人生 > >C#:執行緒(3):執行緒暫停

C#:執行緒(3):執行緒暫停

執行緒暫停是讓某一個執行緒先休眠一段時間,在這段時間內,該執行緒不佔用系統資源

用一個例子說明執行緒休眠,除了主函式還有另一個執行緒,主函式會輸出從11到19的數字,而執行緒會每隔兩秒輸出從1到9的數

(一):首先建立控制檯程式

在預處理部分寫入

using static System.Console;

在主函式下寫入

 System.Threading.Thread t = new System.Threading.Thread(PrintNumbersWithDelay);
 t.Start();
PrintNumbers();

ReadKey();

編寫沒有延遲的輸出函式

        static void PrintNumbers()
        {
            WriteLine("Starting...");
            for (int i = 1; i < 10; i++)
            {
                WriteLine(i+10);
            }
        }

編寫有延遲的輸出函式

        static void PrintNumbersWithDelay()
        {
            WriteLine("Thread starting...");
            for (int i = 1; i < 10; i++)
            {
                System.Threading.Thread.Sleep(TimeSpan.FromSeconds(2));
                WriteLine(i);
            }
        }

(二):執行

結果如下

(三):小結

這個案例真的不算難,但是用來理解執行緒的作用我覺得還是ok的。我理解執行緒是仿照C語言的面向過程程式設計,在使用C語言時,有一個主函式,從頭執行到尾,執行完了,程式就結束。如果把像C這樣從頭執行到尾稱為一個執行流,那麼執行緒其實就是多執行流的一個程式設計模式。

我花了一個簡單的示意圖,可以看到,當主程式執行到t.Start();一句時,產生了一個新的執行流,也就是t執行緒,我使用了了一個向下的分支表示在t執行緒開始之前,主函式還要執行若干語句,放在本例中,就是在輸出“Thread starting...”之前輸出的數字。當新執行緒t建立後,新執行緒就要開始和主程式搶佔cpu時間

在圖中我們用黑色線表示用於該執行緒的cpu時間,如果沒有特意處理(比如說本例用到的語句),cpu用於各執行緒之間的時間是基本平均的,而且隨機性比較強,作為程式設計師我們很難知道程式在哪個語句後會跳到另一個執行緒去執行。

在本例中使用了一個Sleep()語句,其作用是告訴系統,接下來若干時間內不要執行本執行緒的程式碼,系統接受到這樣的訊息之後,就會把接下來的cpu運算時間分配給其他執行緒

(四):原始碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using static System.Console;

namespace Ch1Re2
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Threading.Thread t = new System.Threading.Thread(PrintNumbersWithDelay);
            t.Start();
            PrintNumbers();

            ReadKey();
        }

        static void PrintNumbers()
        {
            WriteLine("Starting...");
            for (int i = 1; i < 10; i++)
            {
                WriteLine(i+10);
            }
        }

        static void PrintNumbersWithDelay()
        {
            WriteLine("Thread starting...");
            for (int i = 1; i < 10; i++)
            {
                System.Threading.Thread.Sleep(TimeSpan.FromSeconds(2));
                WriteLine(i);
            }
        }
    }
}