在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
这个程序的思路是共同做一件事情(从一个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论坛的一个朋友的问题才用了这种办法)。
分享到:
相关推荐
C#关于多线程开发技术的例子,这个代码是结合多线程案例自己写的一个程序,模拟图书馆借阅书籍,在同时发生书籍搜索的时候进行的一些线程同步和加锁机制。
60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建...另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己
多线程同步(mutex)很好的一个资料,简单明了! 多线程同步(mutex)很好的一个资料,简单明了!
本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入 主题,在多线程开发的应用中,线程同步是不可避免的。在.Net框架中,实现线程同步主要通过以下的几种方式来实现,在MSDN的...
本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入主题,在多线程开发的应用中,线程同步是不可避免的。在.Net框架中,实现线程同步主要通过以下的几种方式来实现,在MSDN的...
一个基于C#开发的多线程处理程序源代码,该例子程序代码采用VS2005+C#开发,可以进行多线程进行后台运算程序的同步处理。
1.多线程的概念 2.操纵线程 3.线程的同步和通讯 4.线程池和定时器 5.互斥对象 6.小结
在多线程编程中,经常遇到多线程安全问,常用的主要有代码同步和线程安全包装器等方法。本例针对线程安全包装器编写用例,分享一起学习,实例摘自线程安全手册一书。
本人写的多线程的例子,里面包括线程池、线程同步等的技术。每个代码块儿都有注释,并附有项目需求,真正做到一个例子学会多线程。
同步是一种只允许一个线程在特定时间访问某些资源的技术。没有其他线程可以中断,直到所分配的线程或当前访问线程访问数据完成其任务。 在多线程程序中,允许线程访问任何资源所需的执行时间。线程共享资源并异步...
前段公司有个几台服务器之间的文件同步需求,所以就写了这个小工具,本着学习的目标提供给大家...主要功能:利用FTP比较两个目标目 件夹的文件是否相同,不相同从目标服务器上更新,多任务,多线程,可以停止暂停等。
浏览器就是一个很好的多线程的例子,在浏览器中你可以在下载JAVA小应用程序或图象的同时滚动页面,在访问新页面时,播放动画和声音,打印文件等。 多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望...
也许很多程序员都遇到同步线程的死锁问题,而此例子就是介绍同步线程如何解决死锁的问题同时也提高下载网络资源的速度,尤其是对那些需要做抓网络数据更加需要。
举个例子:如果在一个公司里面有一个变量记录某人T的工资count=100,有两个主管A和B(即工作线程)在早一些时候拿了这个变量的值回去,过了一段时间A主管将T的工资加了5块,并存回count变量,而B主管将T的工资减去3...
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的
第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型...
5.7.5 构造器链:使用this调用另一个构造器 168 5.8 静态成员 172 5.8.1 静态字段 172 5.8.2 静态方法 174 5.8.3 静态构造器 175 5.8.4 静态属性 176 5.8.5 静态类 177 5.9 扩展方法 ...
第七章 多线程程序设计 146 7.1 线程类(Thread)的属性和方法 146 7.2 线程的创建 147 7.3 建立线程类 148 7.4 线程的优先级 149 7.5 多个线程互斥 150 7.6 Monitor类 151 7.7 线程的同步:生产者和消费者关系 151 ...