zoukankan      html  css  js  c++  java
  • 一个简单的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论坛的一个朋友的问题才用了这种办法)。

  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/xxaxx/p/3050168.html
Copyright © 2011-2022 走看看