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

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

这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。

代码如下:

using  System;
using  System.Collections;
using  System.Collections.Generic;
using  System.Threading;

///   <summary>
///  在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
///
/// 这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
/// 作者:周公
///  时间:2008-5-17
///  原发地址: http://blog.csdn.net/zhoufoxcn
///   </summary>
public   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);
        
    }
     ///   <summary>
     ///  开始工作
     ///   </summary>
     public   void  Action()
    {
        threadOne.Start();
        threadTwo.Start();
    }
     ///   <summary>
     ///  共同做的工作
     ///   </summary>
     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();
        
    }
}

说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程(主要是回答csdn论坛的一个朋友的问题才用了这种办法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值