[C#] 一个简单的C#多线程间同步的例子 →→→→→进入此内容的聊天室

来自 , 2020-09-02, 写在 C#, 查看 120 次.
URL http://www.code666.cn/view/63cb524a
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Threading;
  5.  
  6. ///
  7. /// 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
  8. ///
  9. ///这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
  10. ///作者:周公
  11. /// 时间:2008-5-17
  12. /// 原发地址:http://blog.csdn.net/zhoufoxcn
  13. ///
  14. public class ThreadDemo
  15. {
  16. private Thread threadOne;
  17. private Thread threadTwo;
  18. private ArrayList stringList;
  19. private event EventHandler OnNumberClear;//数据删除完成引发的事件
  20. public static void Main()
  21. {
  22. ThreadDemo demo = new ThreadDemo(1000);
  23. demo.Action();
  24. }
  25. public ThreadDemo(int number)
  26. {
  27. Random random = new Random(1000000);
  28. stringList = new ArrayList(number);
  29. for (int i = 0; i < number; i++)
  30. {
  31. stringList.Add(random.Next().ToString());
  32. }
  33. threadOne = new Thread(new ThreadStart(Run));//两个线程共同做一件事情
  34. threadTwo = new Thread(new ThreadStart(Run));//两个线程共同做一件事情
  35. threadOne.Name = "线程1";
  36. threadTwo.Name = "线程2";
  37. OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);
  38.  
  39. }
  40. ///
  41. /// 开始工作
  42. ///
  43. public void Action()
  44. {
  45. threadOne.Start();
  46. threadTwo.Start();
  47. }
  48. ///
  49. /// 共同做的工作
  50. ///
  51. private void Run()
  52. {
  53. string stringValue = null;
  54. while (true)
  55. {
  56. Monitor.Enter(this);//锁定,保持同步
  57. stringValue = (string)stringList[0];
  58. Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue);
  59. stringList.RemoveAt(0);//删除ArrayList中的元素
  60. if (stringList.Count == 0)
  61. {
  62. OnNumberClear(this, new EventArgs());//引发完成事件
  63. }
  64. Monitor.Exit(this);//取消锁定
  65. Thread.Sleep(5);
  66. }
  67. }
  68.  
  69. //执行完成之后,停止所有线程
  70. void ThreadDemo_OnNumberClear(object sender, EventArgs e)
  71. {
  72. Console.WriteLine("执行完了,停止了所有线程的执行。");
  73. threadTwo.Abort();
  74. threadOne.Abort();
  75.  
  76. }
  77. }
  78. //csharp/1150

回复 "一个简单的C#多线程间同步的例子"

这儿你可以回复上面这条便签

captcha