zoukankan      html  css  js  c++  java
  • c#中的多线程

    .NET的运行时环境的主 线程由Main ()方法来启动应用程序,而且.NET的编译语言有自动的垃圾收集功能,这个垃圾收集发生在另外一个线程里面,所有的这些都是后台发生的,让我们无法感觉 到发生了什么事情.在这里默认的是只有一个线程来完成所有的程序任务,但是正如我们在第一篇文章讨论过的一样,有可能我们根据需要自己添加更多的线程让程 序更好的协调工作。比如说我们的例子中,一个有用户输入的同时需要绘制图形或者完成大量的运算的程序,我们必须得增加一个线程,让用户的输入能够得到及时 的响应,因为输入对时间和响应的要求是紧迫的,而另外一个线程负责图形绘制或者大量的运算。

           下面是一个典型的多线程运用实例:

    using System;

    using System.Collections;

    using System.Collections.Generic;

    using System.Threading;

    /// <summary>

    /// 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。

    ///这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。

    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();

            

        }

    }

    说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程。

  • 相关阅读:
    [MSDN] How to Debug a Release Build
    抽象成员 虚方法
    强制类型转换符 和 as 运算符
    一份超长的MySQL学习笔记
    Java反射基础
    c3p0config.xml
    一个JDBC封装工具类
    Spring5——IOC操作Bean管理(基于xml文件)
    Android游戏开发大全
    移除项目里的所有.svn命令
  • 原文地址:https://www.cnblogs.com/itzone/p/2869190.html
Copyright © 2011-2022 走看看