亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#多線程經典示例(吃蘋果)

2019-10-29 21:15:58
字體:
來源:轉載
供稿:網友

本文主要講述了多線程開發中經典示例,通過本示例,可以加深對多線程的理解。

示例概述:

下面用一個模擬吃蘋果的實例,說明C#中多線程的實現方法。要求開發一個程序實現如下情況:一個家庭有三個孩子,爸爸媽媽不斷削蘋果往盤子里面放,老大、老二、老三不斷從盤子里面取蘋果吃。盤子的大小有限,最多只能放5個蘋果,并且爸媽不能同時往盤子里面放蘋果,媽媽具有優先權。三個孩子取蘋果時,盤子不能為空,三人不能同時取,老三優先權最高,老大最低。老大吃的最快,取的頻率最高,老二次之。

涉及到知識點:

  • 線程Thread 創建并控制線程,設置其優先級并獲取其狀態。
  • 鎖 lock 用于實現多線程同步的最直接辦法就是加鎖,它可以把一段代碼定義為互斥段,在一個時刻內只允許一個線程進入執行,而其他線程必須等待。
  • 事件EventHandler 聲明一個事件,用于通知界面做改變

設計思路:

  • Productor 表示生產者,用于削蘋果。
  • Consumer 表示消費者,用于吃蘋果。
  • Dish 盤子,用于裝蘋果,做為中間類
  • EatAppleSmp 的BeginEat()方法,表示開始吃蘋果,啟動線程

效果圖如下【爸爸媽媽削蘋果,孩子吃蘋果】:

C#,多線程

后臺輸出如下:

Mama放1個蘋果Baba放1個蘋果Dage取蘋果吃...Erdi取蘋果吃...Sandi等待取蘋果Mama放1個蘋果Sandi取蘋果吃...Baba放1個蘋果Dage取蘋果吃...Mama放1個蘋果Baba放1個蘋果Erdi取蘋果吃...Mama放1個蘋果Baba放1個蘋果Dage取蘋果吃...Sandi取蘋果吃...Mama放1個蘋果Baba放1個蘋果Erdi取蘋果吃...Mama放1個蘋果Baba放1個蘋果Dage取蘋果吃...Mama放1個蘋果Baba放1個蘋果Sandi取蘋果吃...Mama放1個蘋果Baba正在等待放入蘋果Erdi取蘋果吃...Baba放1個蘋果Dage取蘋果吃...Mama放1個蘋果Baba正在等待放入蘋果Mama正在等待放入蘋果Sandi取蘋果吃...Baba放1個蘋果Mama正在等待放入蘋果Erdi取蘋果吃...Mama放1個蘋果Dage取蘋果吃...Baba放1個蘋果Mama正在等待放入蘋果Dage取蘋果吃...Mama放1個蘋果Baba正在等待放入蘋果Erdi取蘋果吃...Baba放1個蘋果Sandi取蘋果吃...Mama放1個蘋果Baba正在等待放入蘋果Dage取蘋果吃...Baba放1個蘋果Mama正在等待放入蘋果Erdi取蘋果吃...Mama放1個蘋果Baba正在等待放入蘋果Sandi取蘋果吃...Baba放1個蘋果Mama正在等待放入蘋果Dage取蘋果吃...Mama放1個蘋果Baba正在等待放入蘋果Mama正在等待放入蘋果Erdi取蘋果吃...Mama放1個蘋果Baba正在等待放入蘋果Dage取蘋果吃...Baba放1個蘋果Mama正在等待放入蘋果Sandi取蘋果吃...Mama放1個蘋果Baba正在等待放入蘋果Mama正在等待放入蘋果線程 'Mama' (0x1ce0) 已退出,返回值為 0 (0x0)。線程 'Baba' (0x1888) 已退出,返回值為 0 (0x0)。Erdi取蘋果吃...Dage取蘋果吃...Sandi取蘋果吃...Dage取蘋果吃...Erdi取蘋果吃...Dage等待取蘋果Sandi等待取蘋果Erdi等待取蘋果后臺輸出

Productor 代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace DemoSharp.EatApple{ /// <summary> /// 生產者 /// </summary> public class Productor {  private Dish dish;  private string name;  public string Name  {   get { return name; }   set { name = value; }  }  public EventHandler PutAction;//聲明一個事件,當放蘋果時觸發該事件  public Productor(string name, Dish dish)  {   this.name = name;   this.dish = dish;  }  public void run()  {   while (true)   {    bool flag= dish.Put(name);    if (flag)    {     if (PutAction != null)     {      PutAction(this, null);     }     try     {      Thread.Sleep(600);//削蘋果時間     }     catch (Exception ex)     {     }    }    else {     break;    }   }  } }}

Consumer代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace DemoSharp.EatApple{ /// <summary> /// 消費者 /// </summary> public class Consumer {  private string name;  public string Name  {   get { return name; }   set { name = value; }  }  private Dish dish;  private int timelong;  public EventHandler GetAction;//聲明一個事件,當放蘋果時觸發該事件  public Consumer(string name, Dish dish, int timelong)  {   this.name = name;   this.dish = dish;   this.timelong = timelong;  }  public void run()  {   while (true)   {    bool flag= dish.Get(name);    if (flag)    {     //如果取到蘋果,則調用事件,并開始吃     if (GetAction != null)     {      GetAction(this, null);     }     try     {      Thread.Sleep(timelong);//吃蘋果時間     }     catch (ThreadInterruptedException)     {     }    }    else {     break;    }   }  } }}

Dish代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace DemoSharp.EatApple{ /// <summary> /// 盤子,屬于中間類 /// </summary> public class Dish {  private int f = 5;//表示盤子中還可以放幾個蘋果,最多只能放5個蘋果  private int EnabledNum;//可放蘋果總數  private int n = 0; //表示已經放了多少個蘋果  private object objGet = new object();  private object objPut = new object();  /// <summary>  /// 構造函數,初始化Dish對象  /// </summary>  /// <param name="num">表示削夠多少個蘋果結束</param>  public Dish(int num)  {   this.EnabledNum = num;  }  /// <summary>  /// 放蘋果的方法  /// </summary>  /// <param name="name"></param>  ///<returns>是否放成功</returns>  public bool Put(string name)  {   lock (this)//同步控制放蘋果   {    bool flag = false;    while (f == 0)//蘋果已滿,線程等待    {     try     {      System.Console.WriteLine(name + "正在等待放入蘋果");      Monitor.Wait(this);     }     catch (Exception ex)     {      System.Console.WriteLine(name + "等不及了");     }    }     if (n < EnabledNum)    {     f = f - 1;//削完一個蘋果放一次     n = n + 1;     System.Console.WriteLine(name + "放1個蘋果");     flag = true;    }    Monitor.PulseAll(this);    return flag;   }  }  /// <summary>  /// 取蘋果的方法  /// </summary>  /// <param name="name"></param>  public bool Get(string name)  {   lock (this)//同步控制取蘋果   {    bool flag = false;    while (f == 5)    {     try     {      System.Console.WriteLine(name + "等待取蘋果");      Monitor.Wait(this);     }     catch (ThreadInterruptedException) { }    }    if (n <= EnabledNum)    {     f = f + 1;     System.Console.WriteLine(name + "取蘋果吃...");     flag = true;    }    Monitor.PulseAll(this);    return flag;   }  } } }

EatAppleSmp代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace DemoSharp.EatApple{ public class EatAppleSmp {  public EventHandler PutAction;//聲明一個事件,當放蘋果時觸發該事件  public EventHandler GetAction;//聲明一個事件,當放蘋果時觸發該事件  /// <summary>  /// 開始吃蘋果  /// </summary>  public void BeginEat()  {   Thread th_mother, th_father, th_young, th_middle, th_old;//依次表示媽媽,爸爸,小弟,二弟,大哥   Dish dish = new Dish(30);   Productor mother = new Productor("Mama", dish);//建立線程   mother.PutAction += PutActionMethod;   Productor father = new Productor("Baba", dish);   father.PutAction += PutActionMethod;   Consumer old = new Consumer("Dage", dish, 1200);   old.GetAction += GetActionMethod;   Consumer middle = new Consumer("Erdi", dish, 1500);   middle.GetAction += GetActionMethod;   Consumer young = new Consumer("Sandi", dish, 1800);   young.GetAction += GetActionMethod;   th_mother = new Thread(new ThreadStart(mother.run));   th_mother.Name = "Mama";   th_father = new Thread(new ThreadStart(father.run));   th_father.Name = "Baba";   th_old = new Thread(new ThreadStart(old.run));   th_old.Name = "Dage";   th_middle = new Thread(new ThreadStart(middle.run));   th_middle.Name = "Erdi";   th_young = new Thread(new ThreadStart(young.run));   th_young.Name = "Sandi";   th_mother.Priority = ThreadPriority.Highest;//設置優先級   th_father.Priority = ThreadPriority.Normal;   th_old.Priority = ThreadPriority.Lowest;   th_middle.Priority = ThreadPriority.Normal;   th_young.Priority = ThreadPriority.Highest;   th_mother.Start();   th_father.Start();   th_old.Start();   th_middle.Start();   th_young.Start();  }  private void GetActionMethod(object sender,EventArgs e)  {   if (GetAction != null)   {    GetAction(sender, e);   }  }  private void PutActionMethod(object sender, EventArgs e)  {   if (PutAction != null)   {    PutAction(sender, e);   }  } }}

界面類代碼如下:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using DemoSharp.EatApple;namespace DemoSharp{ /// <summary> /// 頁面類 /// </summary> public partial class EatAppleForm : Form {  private EatAppleSmp m_EatAppleSmp = new EatAppleSmp();  public EatAppleForm()  {   InitializeComponent();   InitView();   m_EatAppleSmp.PutAction += PutActionMethod;   m_EatAppleSmp.GetAction += GetActionMethod;  }  /// <summary>  /// 初始化GroupBox  /// </summary>  private void InitView()  {   this.gbBaba.Controls.Clear();   this.gbMama.Controls.Clear();   this.gbDage.Controls.Clear();   this.gbErdi.Controls.Clear();   this.gbSandi.Controls.Clear();  }  /// <summary>  /// 啟動線程  /// </summary>  /// <param name="sender"></param>  /// <param name="e"></param>  private void btnStart_Click(object sender, EventArgs e)  {   this.m_EatAppleSmp.BeginEat();  }  /// <summary>  /// 放蘋果事件  /// </summary>  /// <param name="sender"></param>  /// <param name="e"></param>  private void PutActionMethod(object sender, EventArgs e)  {   Productor p = sender as Productor;   if (p != null)   {    if (p.Name == "Baba")    {     AddItemToGroupBox(this.gbBaba, this.lblBaba);    }    if (p.Name == "Mama")    {     AddItemToGroupBox(this.gbMama, this.lblMama);    }   }  }  /// <summary>  /// 吃蘋果事件  /// </summary>  /// <param name="sender"></param>  /// <param name="e"></param>  public void GetActionMethod(object sender, EventArgs e)  {   Consumer c = sender as Consumer;   if (c != null)   {    if (c.Name == "Dage")    {     AddItemToGroupBox(this.gbDage, this.lblDage);    }    if (c.Name == "Erdi")    {     AddItemToGroupBox(this.gbErdi, this.lblErdi);    }    if (c.Name == "Sandi")    {     AddItemToGroupBox(this.gbSandi, this.lblSandi);    }   }  }  /// <summary>  /// 往指定的GroupBox中添加對象  /// </summary>  /// <param name="gbView"></param>  /// <param name="lbl"></param>  private void AddItemToGroupBox(GroupBox gbView,Label lbl)  {   gbView.Invoke(new Action(() =>   {    PictureBox p = new PictureBox();    p.Width = 20;    p.Height = 20;    p.Dock = DockStyle.Left;    p.Image = this.imgLst01.Images[0];    p.Margin = new Padding(2);    gbView.Controls.Add(p);   }));   //顯示個數   lbl.Invoke(new Action(() => {    if (string.IsNullOrEmpty(lbl.Text))    {     lbl.Text = "0";    }    lbl.Text = (int.Parse(lbl.Text) + 1).ToString();   }));  } }}

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚州av一区二区| 亚洲视频第一页| 日韩欧美在线中文字幕| 国产精品高清网站| 国产精品午夜国产小视频| 久久精品国产96久久久香蕉| 国产精选久久久久久| 91视频国产高清| 日韩大片在线观看视频| 亚洲色图50p| 狠狠爱在线视频一区| 亚洲一区二区三区sesese| 国产亚洲精品久久久久久牛牛| 精品国产精品三级精品av网址| 成人观看高清在线观看免费| 国产综合视频在线观看| 欧美大全免费观看电视剧大泉洋| 亚洲一区二区三区四区在线播放| 国产精品com| 久久99精品久久久久久噜噜| 久久99热精品这里久久精品| 亚洲天堂开心观看| 精品视频在线播放免| 九九久久久久99精品| 亚洲男人天堂九九视频| 国内外成人免费激情在线视频网站| 视频在线一区二区| 在线视频亚洲欧美| 日韩欧美国产成人| 亚洲欧美日韩中文视频| 欧美理论在线观看| 日韩精品日韩在线观看| 亚洲www视频| 亚洲国产精品va在线观看黑人| 亚洲国产一区二区三区四区| 高清欧美一区二区三区| 亚洲精品国产精品自产a区红杏吧| 欧美极品美女电影一区| 孩xxxx性bbbb欧美| 国产亚洲精品综合一区91| 日韩av一区在线观看| 亚洲最大福利网站| 一区二区三区亚洲| 国产精品人成电影在线观看| 91精品久久久久久久久青青| 自拍偷拍亚洲欧美| 亚洲品质视频自拍网| 日韩欧美主播在线| 亚洲国产日韩欧美在线图片| 91在线高清免费观看| 国产精品第七影院| 日本精品性网站在线观看| 久久精品国产免费观看| 91精品视频网站| 久久久久女教师免费一区| 精品国产福利视频| 国产午夜一区二区| 日韩在线视频中文字幕| 久久精品国产久精国产思思| 亚洲人成在线观看网站高清| 国产日本欧美一区二区三区在线| 亚洲人成电影在线播放| 精品一区二区三区四区在线| 91超碰caoporn97人人| 91国偷自产一区二区三区的观看方式| 日本精品视频在线| 色综合久久久久久中文网| 欧美激情一区二区久久久| 亚洲香蕉在线观看| 久久久人成影片一区二区三区观看| 欧美大胆在线视频| 日韩欧美精品在线观看| 久久久影视精品| 狠狠做深爱婷婷久久综合一区| 久久网福利资源网站| 日韩免费在线观看视频| 成人免费网站在线| 欧美精品激情在线观看| 青草青草久热精品视频在线网站| 在线播放日韩专区| 国产97免费视| 欧美性生交xxxxx久久久| 色综合五月天导航| 久久久精品一区二区| 亚洲欧美精品suv| 亚洲自拍偷拍视频| 国产精品ⅴa在线观看h| 久久久国产精品一区| 97视频色精品| 欧美大码xxxx| 亚洲欧洲午夜一线一品| 日韩激情片免费| 久久久综合免费视频| 欧美电影在线观看高清| 久久成人综合视频| 国产精品久久久久91| 欧美人在线视频| 日韩欧美视频一区二区三区| 黑人巨大精品欧美一区二区三区| 亚洲精品乱码久久久久久按摩观| 欧美亚洲成人精品| 91中文字幕在线| 日韩欧美在线免费观看| 午夜精品久久久久久久99热浪潮| 亲子乱一区二区三区电影| 日本精品久久中文字幕佐佐木| 欧美视频裸体精品| 国产精品亚洲精品| 国内免费精品永久在线视频| 91亚洲精华国产精华| 欧美亚洲国产视频| 亚洲精品视频中文字幕| 中文字幕不卡av| 国产精品高潮呻吟久久av无限| 国产精品久久久久久亚洲影视| 成人免费在线视频网站| 色婷婷综合久久久久| 国产不卡av在线| 日韩中文字幕国产| 久久久噜久噜久久综合| 欧美乱大交做爰xxxⅹ性3| 亚洲男人天堂手机在线| 国产在线精品播放| 欧美日韩性生活视频| 国产日韩欧美在线播放| 国产亚洲精品久久久久动| 国产精品无码专区在线观看| 久久资源免费视频| 91久久精品美女高潮| 亚洲一区av在线播放| 精品国产欧美一区二区五十路| 精品调教chinesegay| 亚洲自拍偷拍一区| 欧美wwwxxxx| 亚洲欧美日韩一区二区在线| 中文字幕在线成人| 亚洲天堂网在线观看| 国产丝袜精品第一页| 亚洲男人的天堂在线| 成人激情视频免费在线| 久久视频在线视频| 国产亚洲福利一区| 成人欧美一区二区三区黑人| 亚洲va欧美va国产综合剧情| 亚洲一区二区三区乱码aⅴ| 久久久久久久影视| 欧美有码在线视频| 成人国产在线视频| 国产成人综合亚洲| 久久久精品视频在线观看| 日韩美女av在线| 国产美女精彩久久| 亚洲福利在线观看| 欧美乱大交xxxxx| 亚洲欧美国产日韩中文字幕| 欧洲成人免费aa| 欧美大片免费看| 国产精品极品在线| 欧美电影《睫毛膏》| 成人免费观看a| 亚洲精品久久久久| 成人写真福利网| 精品无人国产偷自产在线| 国产一区二区三区三区在线观看|