C#中添加三個線程同時啟動執行某一方法,並依次調用某方法中的循環打印輸。


添加三個線程同時啟動執行某一方法,並依次調用某方法中的打印輸:ABC ABC ABC ABC

 

 

 

 

實現代碼如下:

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

namespace SuperMarket.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            myTests mt = new myTests();
            mt.RunTest();

        }

    }
    class myTests
    {
        char last = 'c';
        object obj = new object();
        public void RunTest()
        {
            Thread th1 = new Thread(ShowNum);
            Thread th2 = new Thread(ShowNum);
            Thread th3 = new Thread(ShowNum);

            th1.Start('a');
            th2.Start('b');
            th3.Start('c');



        }

        private void ShowNum(object name)
        {
            for (int i = 0; i < 300; i++)
            {
                lock (obj)
                {
                    if ((Char)name == last + 1 || (Char)name == last - 2)//如果是連續的下一個字
                    {
                        Console.WriteLine(name);
                        last = (Char)name;
                        Monitor.PulseAll(obj);
                    }
                    else
                    {
                        i--;
                        Monitor.Wait(obj);
                    }
                }
            }

        }
    }

}


這里介紹下上面的幾處用法:

1、三個線程同時調用ShowNum方法,這時候,由於進入ShowNum方法的先后不同。所以,在執行300次循環時,調用的內容先后是不同的。因此,我們要定義一個Object對像,然后使用lock(obj)將進入循環體的線程鎖定。

2、使用last變量來存放本次打印在屏幕上的字母。下一次進入判斷體時,就知道下一個要打印的是什么了。默認值為c,就意味着第一個要打印的是c-2=a,所以是a字母。

3、對於本輪不應該打印的線程,就讓他到lock外面等候通知。所以調用了Moitor.Wait(obj)方法。因為本次他也執行了判斷,所以循環就少了一次,為了給被回循環,就讓循環變量i的值-1,這就是i--的原因。

4、當打印完后,記錄好本次打印了的字母后,要調用 Monitor.PulseAll方法通知那個正在等候的線程,進入Lock體做判斷。

5、  Monitor.Wait(obj);和 Monitor.PulseAll(obj);可以不加,不過為了提高性能,就最好加上。加與不加的性能相差巨大的。請最好加上。

 

 

 

 

 


免責聲明!

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



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