<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    夢想飛翔

    自強(qiáng)不息
    posts - 111, comments - 30, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    多線程 轉(zhuǎn)發(fā)

    Posted on 2009-02-24 15:00 love1563 閱讀(191) 評論(0)  編輯  收藏 所屬分類: Java語言*初級版

    多線程

    【回目錄】

    多線程是程序員面試時(shí)常常會(huì)面對的問題,對多線程概念的掌握和理解水平,也會(huì)被一些老鳥用來衡量一個(gè)人的編程實(shí)力的重要參考指標(biāo)。不論是實(shí)際工作需要還是為了應(yīng)付面試,掌握多線程都是程序員職業(yè)生涯中一個(gè)必須經(jīng)過的環(huán)節(jié)。其實(shí)當(dāng)你把“多線程”和你的“職業(yè)生涯”聯(lián)系在一起考慮的時(shí)候,就會(huì)覺得“多線程”是多么的渺小,對,沒有跨越不過的山。不過就算它很渺小,但也有可能改變你的人生軌跡。不用擔(dān)心,如果你對多線程還不太熟悉,那么我們就一起來看看什么是多線程吧。

    跟前幾篇的風(fēng)格一樣,我會(huì)在開篇的時(shí)候舉一個(gè)現(xiàn)實(shí)生活中的例子,通過這個(gè)例子來映射一些晦澀枯燥的計(jì)算機(jī)編程專業(yè)知識(shí),在讓讀者朋友很好地理解理論概念的同時(shí),又避免了閱讀教科書時(shí)的枯燥感覺。這次我要舉的例子是公司。不一定是IT公司,盡量和編程領(lǐng)域遠(yuǎn)一點(diǎn)兒吧,那就假設(shè)是一家搬家公司吧。

    假如我們把公司看做是一個(gè)進(jìn)程,那么人就是其中的線程。進(jìn)程必須得有一個(gè)主線程,公司在創(chuàng)業(yè)初期往往可能出現(xiàn)一人打天下的現(xiàn)象,但是,至少得有一個(gè)人,公司才能運(yùn)作。公司創(chuàng)業(yè)初期,業(yè)務(wù)還不算太多,往往就是老板一個(gè)人身兼數(shù)職,一天如果只有1、2趟活兒,應(yīng)該還是忙得過來的。時(shí)間長了,隨著業(yè)務(wù)的發(fā)展、口碑地建立,生意越來越興隆,一個(gè)人肯定就忙不過來了。假設(shè)一天有5個(gè)活兒,老板一個(gè)人必須搬完A家才能搬B家,搬到黃昏估計(jì)也就搬到C家,D和E家都還在焦急地等待著呢。老板一個(gè)人要充當(dāng)搬運(yùn)工、司機(jī)、業(yè)務(wù)聯(lián)系人、法人代表、出納等眾多角色,累死累活公司的規(guī)模也上不去,人手不夠制約了公司的發(fā)展。那么怎么辦,很簡單,增加人手,用編程的話來說就是“再起個(gè)線程”。

    我們現(xiàn)在就用代碼來描述這樣的場景吧,首先,我們準(zhǔn)備成立一家搬家公司,于是要準(zhǔn)備好將來和客戶簽的合同書:

       1: public class Contract
       2: {
       3:     public string ID { get; private set; }
       4:     public string From { get; set; }
       5:     public string To { get; set; }
       6:     public decimal Fee { get; set; }
       7:  
       8:     public Contract()
       9:     {
      10:         this.ID = DateTime.Now.ToBinary().ToString().Replace("-", String.Empty);
      11:     }
      12: }

     

    簡是簡單了點(diǎn)兒,好歹也是份合同,現(xiàn)在我們就去申請注冊一家公司,并組建好初創(chuàng)團(tuán)隊(duì),哪怕目前還只有老板一個(gè)人:

       1: public class HouseMovingCompany
       2: {
       3:     private static HouseMovingCompany _instance = null;
       4:     public static HouseMovingCompany Instance
       5:     {
       6:         get { return (_instance == null ? _instance = new HouseMovingCompany() : _instance); }
       7:     }
       8:  
       9:     public List<Contract> Contracts { get; private set; }
      10:  
      11:     public HouseMovingCompany()
      12:     {
      13:         this.Contracts = new List<Contract>();
      14:     }
      15:  
      16:     public void MoveHouse()
      17:     {
      18:         if (this.Contracts == null || this.Contracts.Count == 0)
      19:         {
      20:             return;
      21:         }
      22:  
      23:         Contract contract = contract = this.Contracts[0];
      24:         this.Contracts.RemoveAt(0);
      25:  
      26:         if (!String.IsNullOrEmpty(contract.From) && !String.IsNullOrEmpty(contract.To))
      27:         {
      28:             Console.WriteLine("Move the house from {0} to {1}.", contract.From, contract.To);
      29:         }
      30:  
      31:         Thread.Sleep(5000);
      32:     }
      33: }

    好了,現(xiàn)在公司實(shí)體有了,老板就可以開始忙活了:

       1: static void Main(string[] args)
       2: {
       3:     HouseMovingCompany.Instance.Contracts.Add(new Contract { From = "WuDaokou", To = "LinDa Road", Fee = 500 });
       4:  
       5:     while (HouseMovingCompany.Instance.Contracts.Count > 0)
       6:     {
       7:         HouseMovingCompany.Instance.MoveHouse();
       8:     }
       9: }

    我們在前面設(shè)置了每次搬家耗時(shí)5秒鐘,咱們把它想象成5個(gè)小時(shí)。嗯,一天接一個(gè)單子,還可以接受,但是隨著老板生意日漸興隆,有時(shí)候一天要接3個(gè)單子,這就最少要工作15個(gè)小時(shí)了,還要操心公司的運(yùn)營等問題,的確忙不過來了,而且照這樣算,老板一天不可能完成5個(gè)或5個(gè)以上的單子,嚴(yán)重制約了公司的發(fā)展:

       1: static void Main(string[] args)
       2: {
       3:     HouseMovingCompany.Instance.Contracts.Add(new Contract { From = "WuDaokou", To = "LinDa Road", Fee = 500 });
       4:     HouseMovingCompany.Instance.Contracts.Add(new Contract { From = "XiDan", To = "WangFujing", Fee = 1000 });
       5:     HouseMovingCompany.Instance.Contracts.Add(new Contract { From = "XiangShan", To = "The Forbidden City", Fee = 10000 });
       6:  
       7:     while (HouseMovingCompany.Instance.Contracts.Count > 0)
       8:     {
       9:         HouseMovingCompany.Instance.MoveHouse();
      10:     }
      11: }

    一天夜里,老板拖著疲倦的身子回到家里,一進(jìn)門就一頭倒在床上,他極力睜著快睜不開的眼睛,努力地對自己說:“不行,我一定要想個(gè)辦法,不然我會(huì)被累死的!”。

    其實(shí)辦法很簡單,誰都知道,招聘幾個(gè)員工,再買幾輛車,大家分頭行動(dòng),不僅分擔(dān)了工作負(fù)擔(dān),而且在規(guī)模擴(kuò)大的同時(shí)還可以完成更多更大的單子。好,我們現(xiàn)在就借助多線程機(jī)制來實(shí)現(xiàn)我們的想法:

       1: static void Main(string[] args)
       2: {
       3:     HouseMovingCompany.Instance.Contracts.Add(new Contract { From = "WuDaokou", To = "LinDa Road", Fee = 500 });
       4:     HouseMovingCompany.Instance.Contracts.Add(new Contract { From = "XiDan", To = "WangFujing", Fee = 1000 });
       5:     HouseMovingCompany.Instance.Contracts.Add(new Contract { From = "XiangShan", To = "The Forbidden City", Fee = 10000 });
       6:  
       7:     Thread thread = null;
       8:  
       9:     while (HouseMovingCompany.Instance.Contracts.Count > 0)
      10:     {
      11:         thread = new Thread(new ThreadStart(HouseMovingCompany.Instance.MoveHouse));
      12:  
      13:         thread.Start();
      14:     }
      15: }

    在這段程序中,我們分頭行動(dòng),讓每項(xiàng)搬家任務(wù)都由一個(gè)小團(tuán)隊(duì)去完成,結(jié)果我們發(fā)現(xiàn),現(xiàn)在做三個(gè)單子的時(shí)間跟做一個(gè)單子的時(shí)間是一樣的,提高了效率也擴(kuò)大了公司規(guī)模。但是,既然引入了新的工作機(jī)制,我們在公司內(nèi)部也不得不做一些小小的調(diào)整:

       1: public void MoveHouse()
       2: {
       3:     if (this.Contracts == null || this.Contracts.Count == 0)
       4:     {
       5:         return;
       6:     }
       7:  
       8:     Contract contract = null;
       9:  
      10:     lock (this.Contracts)
      11:     {
      12:         contract = this.Contracts[0];
      13:         this.Contracts.RemoveAt(0);
      14:     }
      15:  
      16:     if (!String.IsNullOrEmpty(contract.From) && !String.IsNullOrEmpty(contract.To))
      17:     {
      18:         Console.WriteLine("Move the house from {0} to {1}.", contract.From, contract.To);
      19:     }
      20:  
      21:     Thread.Sleep(5000);
      22: }

    調(diào)整的只是MoveHouse這個(gè)方法內(nèi)部的一些實(shí)現(xiàn)細(xì)節(jié)。公司接到的單子都保存在Contracts中,所以搬家的時(shí)候需要去拿一個(gè)單子然后根據(jù)單子上的信息來工作。原先我們只有一個(gè)線程在操作Contracts,倒也不覺得什么,現(xiàn)在有多個(gè)線程都在對Contracts中的元素進(jìn)行存取,我們不得不提防一些意外發(fā)生。這就是在使用多線程的時(shí)候常常需要考慮的并發(fā)問題,所以我們用了lock關(guān)鍵字,當(dāng)一個(gè)線程要操作Contracts時(shí),它先把Contracts鎖起來,其實(shí)就是聲明一下:“現(xiàn)在我在操作它,你們誰都不要?jiǎng)樱任遗炅嗽僬f。”在lock塊結(jié)束時(shí)被鎖定的對象才會(huì)被解鎖,其它的線程現(xiàn)在才可以去操作它。

    有了多線程機(jī)制,你會(huì)發(fā)現(xiàn)程序可以在更短的時(shí)間內(nèi)完成更多的事情。本文沒有將多線程機(jī)制中的所有概念面面俱到地列舉出來,但是已經(jīng)向你展示了該如何使用多線程以及什么時(shí)候可以考慮使用多線程,其它的一些細(xì)節(jié)有待你去進(jìn)一步探索,例如,你可以設(shè)置線程的優(yōu)先級(假設(shè)邏輯上跟Fee掛鉤,類似于‘加急’)等等。

    掌握多線程機(jī)制,并讓它使你的應(yīng)用程序變得更加強(qiáng)悍吧。

    主站蜘蛛池模板: 国产特级淫片免费看| 日韩在线观看免费完整版视频| 亚洲AV中文无码字幕色三| 亚洲精品成人片在线观看| 免费大学生国产在线观看p| 国产一级高清免费观看| 国产精品免费视频网站| 国产gav成人免费播放视频| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 久久亚洲2019中文字幕| 亚洲人成国产精品无码| 亚洲一级特黄无码片| 伊人久久综在合线亚洲91| 亚洲精品字幕在线观看| 亚洲AV无码专区国产乱码电影 | 免费人成无码大片在线观看| 免费国产成人高清在线观看麻豆 | 成年女人午夜毛片免费视频| 成人免费无码大片a毛片| 国产麻豆剧传媒精品国产免费| 国产午夜鲁丝片AV无码免费| 亚洲av无码国产精品色在线看不卡| 亚洲高清无码专区视频| 亚洲日本乱码在线观看| 亚洲伊人久久大香线蕉苏妲己| 久久久久亚洲AV无码观看 | 亚洲人成人一区二区三区| 久久精品国产亚洲av麻豆| 亚洲一卡二卡三卡四卡无卡麻豆 | 亚洲精品国产美女久久久| 亚洲小视频在线观看| 国产亚洲精品VA片在线播放| 亚洲AV成人一区二区三区观看| 免费人人潮人人爽一区二区| 国产一级一毛免费黄片| 亚洲毛片在线免费观看| 精品国产免费观看| 亚洲午夜久久久久久噜噜噜| 亚洲特级aaaaaa毛片| 国产精品亚洲专区在线播放| 三级黄色片免费看|