【ITOO】--不知道多執行緒你就就out了

ZeroWM發表於2015-06-11

  還在為所做的系統載入過慢,過卡而發愁嗎?不知道多執行緒,你就out了。最近用了大概兩三天的時間,研究多執行緒。通過小組的交流,對多執行緒有了更加深入的思考。希望能夠加到ITOO專案裡面,優化一下系統效能。


概念

   執行緒是程式中的一個單一的順序控制流。程式內一個相對獨立,可排程的執行單元件,是系統獨立排程和分派CPU的基本單位值執行總的程式的排程單位。在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒。

  

基礎


   執行緒需要引入.NET程式集System.Threading;上面寫了一個簡單執行緒的狀態和狀態之間轉換需要呼叫的方法。幾個常用的屬性、方法:

         

   

   

   如果希望看的更加詳細,還可以訪問MSDN


例項

    用.Net最基礎啟多執行緒的方式,完成一個求100之內有多少個素數的多執行緒Demo。比如一個執行緒求1~10之內的素數個數,另一個執行緒求11~20之內的素數個數……然後將結果彙總,輸出最終結果。

    

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

namespace ThreadMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            //例項化一個陣列
            List<int> list = new List<int>();
            //開啟一個執行緒,執行緒引數就是list.AddRange(GetZhishu(1,10)),返回值也為list.AddRange(GetZhishu(1,10))
            Thread t = new Thread(() =>
            {
                list.AddRange(GetZhishu(1, 10));
            });
            //開啟執行緒T
            t.Start();
        
            Thread t1 = new Thread(() =>
            {
                list.AddRange(GetZhishu(10, 20));
            });      
            t1.Start();

            Thread t2 = new Thread(() =>
            {
                list.AddRange(GetZhishu(20, 30));
            });
            t2.Start();

            Thread t3 = new Thread(() =>
            {
                list.AddRange(GetZhishu(30, 40));
            });
            t3.Start();

            Thread t4 = new Thread(() =>
            {
                list.AddRange(GetZhishu(40, 50));
            });
            t4.Start();

            Thread t5 = new Thread(() =>
            {
                list.AddRange(GetZhishu(50, 60));
            });
            t5.Start();

            Thread t6 = new Thread(() =>
            {
                list.AddRange(GetZhishu(60, 70));
            });
            t6.Start();

            Thread t7 = new Thread(() =>
            {
                list.AddRange(GetZhishu(70, 80));
            });
            t7.Start();

            Thread t8 = new Thread(() =>
            {
                list.AddRange(GetZhishu(80, 90));
            });
            t8.Start();

            Thread t9 = new Thread(() =>
            {
                list.AddRange(GetZhishu(90, 100));
            });
            t9.Start();
            //執行緒休眠0.1s
            Thread.Sleep(100);
            //迴圈陣列list,並列印
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
            Console.Read();
        }

        /// <summary>
        /// 獲取質數的方法
        /// </summary>
        /// <param name="start">獲取質數範圍的起始值</param>
        /// <param name="end">獲取質數範圍的終止值</param>
        /// <returns>質數的List集合</returns>
        static List<int> GetZhishu(int start, int end)
        {
            int i, j; //定義兩個變數i,j
            List<int> list = new List<int>();//例項化int型別的list集合
            //質數除1和本身不能被其他數整除,讓每個數除以它一半以前的數,如果不能被前半段整除,就肯定不能被後半段整除,把結果新增到list集合裡面
            for (i = start; i < end; i++)
            {
                for (j = 2; j <= i / 2; j++)
                {
                    if (i % j == 0)
                        break;
                }
                if (j > i / 2)
                    list.Add(i);
            }
            return list;
        }

    }
}

    思路就是首先開啟10個執行緒,分為十個不同的資料段,然後每個執行緒都通過Lambda式將委託的方法當做引數傳入到執行緒裡面。傳入完成後,執行緒休眠0.1s,然後通過迴圈列印輸出結果。 寫的演算法還有點小缺陷,2,3也為質數,沒能加到演算法裡面,還有待改進。


擴充

    Java和.NET的多執行緒基本類似,不過Java跟.NET執行緒也有不同的地方,Java種的Fork/Join框架是將一根任務分解成不同的執行緒來執行,一個執行緒執行完成後,還可以幫助其他的執行緒執行任務。但是在.NET這邊更加側重執行緒的安全性,不允許訪問其他的執行緒。

    多執行緒、分散式都體現了一種分治的思想,把複雜問題簡單化,大任務分解成小任務。另外執行緒裡面的鎖和分散式事務結合起來。比方說,兩個人同時取同一張銀行卡的錢,多執行緒可以給該執行緒加鎖,防止其他的執行緒進入,造成透支。如果進行轉賬操作,A賬戶錢減少,B賬戶錢增加,必須做成事務,保證資料的一致性。

    另外多執行緒也不一定意味著高效。執行緒之間的資源是可以共享的,如果開啟的執行緒過多,就像一個超市的打包的員工,同時為2個收銀員打包,效率還不錯;要是同時為200個收銀員服務,那跑路的時間就很奢侈了。

    多執行緒的適用範圍:1.不阻斷主執行緒,實現即時響應,由後臺執行緒完成即時操作 2.多個執行緒,完成同類任務,提高併發性 3.一個任務多個步驟,多執行緒執行各自任務。


總結

    總以為自己跟大牛的差距很大,不要以為完了就算了,用行動來證明團隊的力量是偉大的。

    



相關文章