c# 多线程 源码3

来源:互联网 发布:中华合众国知乎 编辑:程序博客网 时间:2024/06/08 02:10

在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。

这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;using System.Threading;namespace ConsoleApplication1{    class ThreadDemo    {        private Thread threadOne;    private Thread threadTwo;    private ArrayList stringList;    private event EventHandler OnNumberClear;//数据删除完成引发的事件        //public static void Main()        //{        //    ThreadDemo demo = new ThreadDemo(1000);        //    demo.Action();        //}    public ThreadDemo(int number)    {        Random random = new Random(1000000);        stringList = new ArrayList(number);        for (int i = 0; i < number; i++)        {            stringList.Add(random.Next().ToString());        }        threadOne = new Thread(new ThreadStart(Run));//两个线程共同做一件事情        threadTwo = new Thread(new ThreadStart(Run));//两个线程共同做一件事情        threadOne.Name = "线程1";        threadTwo.Name = "线程2";        OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);     }    ///    /// 开始工作    ///    public void Action()    {        threadOne.Start();        threadTwo.Start();    }    ///    /// 共同做的工作    ///    private void Run()    {        string stringValue = null;        while (true)        {            Monitor.Enter(this);//锁定,保持同步            stringValue = (string)stringList[0];            Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue);            stringList.RemoveAt(0);//删除ArrayList中的元素            if (stringList.Count == 0)            {                OnNumberClear(this, new EventArgs());//引发完成事件            }            Monitor.Exit(this);//取消锁定            Thread.Sleep(5);        }    }     //执行完成之后,停止所有线程    void ThreadDemo_OnNumberClear(object sender, EventArgs e)    {        Console.WriteLine("执行完了,停止了所有线程的执行。");        threadTwo.Abort();        threadOne.Abort();    }}}


原创粉丝点击