簡體   English   中英

線程-執行時間模擬

[英]Threads - Simulation of execution time

我有兩個輔助線程,它們執行如下所述的WriteX方法:

    static void Main(string[] args)
    {

        ThreadStart one = new ThreadStart(WriteX);
        Thread startOne = new Thread(one);
        ThreadStart two = new ThreadStart(WriteX);
        Thread startTwo = new Thread(two);
        startOne.Start();
        startTwo.Start();
        Console.ReadKey(true);
    }

    public static void WriteX()
    {
        for (int i = 1; i <= 3; i++)
        {
            Console.WriteLine("Hello");
            Thread.Sleep(1000);
        }
    }

(1)如何找到“ startOne”和“ startTwo”完成任務所需的時間(以毫秒為單位)?

(2)我啟動了線程(Start())。成功執行后是否需要停止線程,還是由主線程(在這種情況下為Main())處理?

(3)我如何打印消息,startOne正在執行WriteX()方法,startTwo正在執行WriteX()方法?

在每個重要的日志記錄框架中,都可以在輸出消息中包括線程ID或線程名稱。 如果只想使用控制台,則可能必須手動將當前線程ID /名稱附加到消息中。

像這樣:

public static void WriteX()
{
    var sw = Stopwatch.StartNew();
    for (int i = 1; i <= 3; i++)
    {
        Console.WriteLine("Hello");
        Thread.Sleep(1000);
    }
    sw.Stop();
    Console.WriteLine("{0} {1}", 
                      Thread.CurrentThread.ManagedThreadId, 
                      sw.Elapsed);
}

要命名線程,只需在線程實例上使用Name屬性:

ThreadStart one = new ThreadStart(WriteX);
Thread startOne = new Thread(one);
startOne.Name = "StartOne";

//...

Console.WriteLine("{0} {1}", Thread.CurrentThread.Name, sw.Elapsed);

同樣,當您作為ThreadStart構造函數參數傳遞的方法完成時,線程會自動結束。 如果要等待主線程中的線程結束,請使用Join方法。

  1. WriteX()包裹WriteX() ,以節省當前前后的時間(或者只是在WriteX()的開始和結束時進行WriteX() ),並在末尾打印差異。

  2. 傳遞給ThreadStart的方法完成后,線程將自行終止(並自行清理)

  3. 同樣,將WriteX()包裝WriteX()日志記錄的內容中。 我建議查看ThreadStart的源代碼,以了解其實現方式以及如何擴展/包裝它。

如果您不知道我在說什么, 這篇文章可能會有所幫助。

  1. 這取決於您要獲得兩個獨立任務的執行時間之和還是最大任務的執行時間之和。 在第一種情況下,您需要在WriteX中測量所需的時間。 在第二種情況下,在startOne之前並在兩個參數都結束時停止測量。 在兩種情況下都使用Stopwatch

  2. 使用Thread.Join等待兩個線程完成。

  3. 使用參數化的啟動Thread.Start(object)並在其中傳遞任務名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM