收藏来自http://blog.csdn.net/zhoufoxcn/article/details/2453803 的文章
来源:互联网 发布:www.web pro seo.com 编辑:程序博客网 时间:2024/05/02 02:37
http://blog.csdn.net/zhoufoxcn/article/details/2453803
在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
这个程序的思路是共同做一件事情(从一个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;//数据删除完成引发的事件
publicstatic 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>
publicvoid Action()
{
threadOne.Start();
threadTwo.Start();
}
/// <summary>
/// 共同做的工作
/// </summary>
privatevoid 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();
}
}
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;//数据删除完成引发的事件
publicstatic 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>
publicvoid Action()
{
threadOne.Start();
threadTwo.Start();
}
/// <summary>
/// 共同做的工作
/// </summary>
privatevoid 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论坛的一个朋友的问题才用了这种办法)。
原文出处:
http://blog.csdn.net/zhoufoxcn/article/details/2453803
- 收藏来自http://blog.csdn.net/zhoufoxcn/article/details/2453803 的文章
- net 2.0 BackgroundWorker类详细用法 http://blog.csdn.net/zhoufoxcn/article/details/1832819
- web.config详解(原文:http://blog.csdn.net/zhoufoxcn/article/details/3265141)
- 在.NET使用JSON作为数据交换格式(转http://blog.csdn.net/zhoufoxcn/article/details/6254657)
- 文章出自http://blog.csdn.net/loongggdroid/article/details/17616509
- 虚函数很好的文章http://blog.csdn.net/haoel/article/details/1948051/
- DP基础问题若干(ACM/ICPC) 来自http://blog.csdn.net/accry/article/details/6607593
- tomcat-转载来自http://blog.csdn.net/rentian1/article/details/51208703
- vector中的find 文章来自网络,如有侵权,请及时联系,马上删除http://blog.csdn.net/huangyimin/article/details/6133650
- 堆和栈的区别(转过无数次的文章)http://blog.csdn.net/hairetz/article/details/4141043
- linux学习好文章:http://blog.csdn.net/ithomer/article/details/7827045
- redis学习文章 http://blog.csdn.net/htofly/article/details/7683060
- 转载文章:连接:http://blog.csdn.net/gideal_wang/article/details/4316691
- PrintStream: - shichunle的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/shichunle/article/details/6754930
- 第一类,第二类Stirling数,Bell数模板 来自(http://blog.csdn.net/sr_19930829/article/details/40888349)
- http://blog.csdn.net/IBM_hoojo/article/details/5688947
- http://blog.csdn.net/chenlaic/article/details/6143235
- http://blog.csdn.net/eaglewood2005/article/details/4335052
- 一些书
- 设计模式之 工厂模式 及 c++ 实现
- InterlockedIncrement和InterlockedDecrement是做什么用的
- 使用qt creator2.60编写c/c++程序(windows7-64bit)
- jquery ajax struts2 json
- 收藏来自http://blog.csdn.net/zhoufoxcn/article/details/2453803 的文章
- 第一家公司第二面的笔试
- 搜索引擎的那些事(开篇)
- 【Cocos2d-x游戏引擎开发笔记(4)】系统动画
- Hibernate的unsaved-value
- Monad-进阶理解
- 第二家公司的笔试、机试、面试。
- 物理地址,虚拟地址,线性地址及逻辑地址
- 理解$HandlerLabel HANDLER $HandleLabel宏