一个简单的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论坛的一个朋友的问题才用了这种办法)。

时间: 2024-11-02 04:57:59

一个简单的C#多线程间同步的例子的相关文章

Windows 95多线程间同步事件的控制方法

摘要:在Windows 95中所有的应用程序实际上都以是线程的方式运行的.在设计多线程应用程序中有时必须在线程之间保持一定的同步关系,才能使用户能够对独立运行的线程进行有效的控制.为此本文在简要介绍Windows 95中线程的概念及其创建方法后,提出了一种在多线程之间利用 event对象实现事件同步的控制方法.最后还介绍了在不同应用程序之间进行同步事件控制的方法,这种方法使得不同应用程序进行相互间的同步事件控制变得很简单. 关键词:Windows95 线程 同步事件 event 对象 Win32

写了一个简单的NodeJS实现的进程间通信的例子

1. cluster介绍 大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算.所以,有人开发了第三方的cluster,让node可以利用多核CPU实现并行.随着nodejs的发展,让nodejs上生产环境,就必须是支持多进程多核处理!在V0.6.0版本,Nodejs内置了cluster的特性.自此,Nodejs终于可以作为一个独立的应用开发解决方案,映入大家眼帘了. cluster是一个nodejs内置的模块,用于nodejs多核处理.clu

一个简单的多线程即时通讯程序(类似QQ,MSN)

本文实现一个简单的多线程客户/服务器即时通讯应用程序,它将使用TCP连接.允许客户之间及客户 和服务器之间,个人消息与会议通信.最终目标是实现象雅虎/msn这样的即时通讯工具. [库] 我创建一个ChatLibrary,它包含命令及可以着色的消息.public enum Command { Login = 0, PersonalMessage = 1, ClientList = 2, Conference = 3, Logout = 4 }; public class Message { str

Linux下一个简单的多线程互斥锁的例子

本篇文章是对Linux下一个简单的多线程互斥锁的例子进行了分析介绍,需要的朋友可以参考下   复制代码 代码如下: #include <stdio.h> #include <pthread.h> pthread_mutex_t Device_mutex ; int count=0; void thread_func1() {    while(1)    {        pthread_mutex_lock(&Device_mutex);        printf(&q

用Python实现一个简单的多线程TCP服务器的教程

  这篇文章主要介绍了用Python实现一个简单的多线程TCP服务器的教程,示例的运行环境为Windows操作系统,需要的朋友可以参考下 最近看<python核心编程>,书中实现了一个简单的1对1的TCPserver,但是在实际使用中1对1的形势明显是不行的,所以研究了一下如何在server端通过启动不同的线程(进程)来实现每个链接一个线程. 其实python在类的设计上已经考虑到了这一方面的需求,我们只要在自己的server上继承一下SocketServer.BaseRequestHandl

求一个简单多线程例子

问题描述 求一个简单多线程例子 解决方案 解决方案二:http://blog.csdn.net/jinjazz/archive/2008/05/06/2397136.aspx

多线程间,变量可见性问题。一个线程会永远看不到另一个线程的更新吗?

问题描述 多线程间,变量可见性问题.一个线程会永远看不到另一个线程的更新吗? 作者说,由于读线程可能永远发现不了main对ready变量的修改就会永远循环下去,但是貌似不太可能永远读不到main对ready变量修改之后的值吧,可能会由于从栈区复制回堆区时,有几毫秒的误差,read线程读到的是旧值,但堆区值更新之后,read线程就读到了新值了吧,为什么说会永远循环下去呢? 解决方案 再回去又读了一遍,有如下解释: 根据JVM设置,如果设置成server模式会有指令重排,如上述循环判断就会变成if(

进程间同步之--信号量

     信号量分有名和无名信号量.它们的区别和管道及命名管道的区别类似.有名信号量要求创建一个文件,而无名信号量则直接保存在内存中. 一,Posix信号量Posex信号量接口总结(见下图):上面一行是有名信号量,可于fifo相类比,其值保存在文件中,可用于进程和线程同步;下面一行是无名信号量,可与pipe相类比,其值保存在内存中,可用于进程和线程同步;中间部分,是两者的公用接口. sem_open() sem_close(),sem_unlink() //有名信号量 \ |sem_wait()

Java多线程的同步示例及对象锁机制

java多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问. 下面以一个简单的实例来进行对比分析.实例要完成的工作非常简单,就是创建10个线程,每个线程都打印从0到99这100个数字,我们希望线程之间不会出现交叉乱序打印,而是顺序地打印. 先来看第一段代码,这里我们在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,但结果并不如我们希望那样,这 是因为这里synchronized锁住的是this对象,即