您的位置:首页 > 大数据 > 人工智能

收藏来自http://blog.csdn.net/zhoufoxcn/article/details/2453803 的文章

2012-12-07 22:29 344 查看
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;//数据删除完成引发的事件
    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论坛的一个朋友的问题才用了这种办法)。



原文出处:

http://blog.csdn.net/zhoufoxcn/article/details/2453803
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐