VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • 一个简单的多线程之间同步的例子

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
  在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
  这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
  代码如下:
usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Threading;
///<summary>
///在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
///
///这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
///作者:周公
///时间:2008-5-17
///原发地址:http://blog.csdn.net/zhoufoxcn
///</summary>
publicclassThreadDemo
{
  privateThreadthreadOne;
  privateThreadthreadTwo;
  privateArrayListstringList;
  privateeventEventHandlerOnNumberClear;//数据删除完成引发的事件
  publicstaticvoidMain()
  {
    ThreadDemodemo=newThreadDemo(1000);
    demo.Action();
  }
  publicThreadDemo(intnumber)
  {
    Randomrandom=newRandom(1000000);
    stringList=newArrayList(number);
    for(inti=0;i<number;i++)
    {
      stringList.Add(random.Next().ToString());
    }
    threadOne=newThread(newThreadStart(Run));//两个线程共同做一件事情
    threadTwo=newThread(newThreadStart(Run));//两个线程共同做一件事情
    threadOne.Name="线程1";
    threadTwo.Name="线程2";
    OnNumberClear+=newEventHandler(ThreadDemo_OnNumberClear);
    
  }
  ///<summary>
  ///开始工作
  ///</summary>
  publicvoidAction()
  {
    threadOne.Start();
    threadTwo.Start();
  }
  ///<summary>
  ///共同做的工作
  ///</summary>
  privatevoidRun()
  {
    stringstringValue=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,newEventArgs());//引发完成事件
      }
      Monitor.Exit(this);//取消锁定
      Thread.Sleep(5);
    }
  }
  //执行完成之后,停止所有线程
  voidThreadDemo_OnNumberClear(objectsender,EventArgse)
  {
    Console.WriteLine("执行完了,停止了所有线程的执行。");
    threadTwo.Abort();
    threadOne.Abort();
    
  }
}
  说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程(主要是回答csdn论坛的一个朋友的问题才用了这种办法)。
 


相关教程