• ASP.NET温故而知新学习系列之ASP.NET多线程编程—多线程实现数组排序(十)


      阅读目录

      一:前言

      二:多线程实现数组排序

      一:前言

      数组大小是计划对多少个数组元素进行排序,线程个数是你计划用多少个线程进行排序操作

      二:多线程实现数组排序

        private int[] array;
            private DateTime StartTime;
            private DateTime EndTime;
            private static volatile bool swaped = true;
            private static long threadCounter = 0;
            private static volatile string strng = "";
            protected void Page_Load(object sender, EventArgs e)
            {
                if (Application["ThreadAndTime"] != null)
                {
                    txtResult.Text = Application["ThreadAndTime"].ToString();
                    txtOut.Text = Application["OutTxt"].ToString();
                }
            }

        /// <summary>
            /// 排序按钮被单击
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void btnSort_Click(object sender, EventArgs e)
            {
                btnSort.Enabled = false;
                int ArrayCount = Convert.ToInt16(ddlArrayCount.SelectedItem.Text.Trim());
                int ThreadCount = Convert.ToInt16(ddlThreadCount.SelectedItem.Text.Trim());          
                array = new int[ArrayCount];
                array.Initialize();
                threadCounter = 0;
                lblMessage.Text = "排序正在进行中......";
         //我们先把数组里面的元素都弄成倒序排列
                for (int i = 0; i < array.Length; i++)
                {
                    array[i] = array.Length - i;
                }
                StartTime = DateTime.Now;
                for (int i = 0; i < ThreadCount; i++)
                {
                    Thread thread = new Thread(new ThreadStart(SortArray));
                    thread.Name = i.ToString();
                    thread.Start();
                }
                Page.RegisterStartupScript("", "<script>window.setTimeout('location.href=location.href',5000);</script>");
            }

            /// <summary>
            /// 真正执行排序操作的方法
            /// </summary>
            private void SortArray()
            {
                try
                {
                    while(true)
                    {
                        swaped = false;
                        for (int i = 0; i < array.Length-1; i++)
                        {  
                            lock(typeof(Thread))
                            {
                                if(array[i] > array[i+1])
                                {
                                    int temp = array[i];
                                    array[i] = array[i+1];
                                    array[i+1] = temp;
                                    swaped = true;
                                }
                            }
                        }
                        Thread.Sleep(1);
                        if(!swaped)
                        {
                            break;
                        }
                    }
                    Thread.CurrentThread.Abort();
                }
                catch (Exception ex)
                {
                    if (Interlocked.Increment(ref threadCounter) == Convert.ToInt64(ddlThreadCount.SelectedItem.Text.ToString().Trim()))
                    {
                        DisplayInfo();
                    }
                }
            }

            /// <summary>
            /// 显示排序完毕的信息
            /// </summary>
            public void DisplayInfo()
            {
                lblMessage.Text = "排序结束......";
                strng = "";
                for (int i = 0; i < array.Length; i++)
                {
                    strng += array[i].ToString() + " ";
                }
                EndTime = DateTime.Now;
                btnSort.Enabled = true;
                TimeSpan timespan = EndTime - StartTime;//时间跨度
                Application["ThreadAndTime"] += "Threads: " + ddlThreadCount.SelectedItem.Text.ToString().Trim() + " 所用毫秒数:" + Convert.ToString(timespan.TotalMilliseconds) + "\r\n";
                Application["OutTxt"] = strng + "\r\n";
            }

        /// <summary>
            /// 清空数组排序后控件信息
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>   
        protected void btnEmptyOne_Click(object sender, EventArgs e)
            {
                Application["OutTxt"] = "";
                txtOut.Text = "";
            }

         /// <summary>
            /// 清空排序完毕的信息
            /// </summary>
            /// <param name="sender"></param>
        protected void btnEmptyTwo_Click(object sender, EventArgs e)
            {
                Application["ThreadAndTime"] = "";
                txtResult.Text = "";
            }

      我们选择数组大小是500个元素,用1个线程去进行排序操作,发现共花费了1109.375毫秒,我们知道1000毫秒等于1秒,也就是说用1个线程去排序数组大是500个元素的数组共花费了1秒多

       

       我们依然选择数组大小是500个元素,用5个线程去进行排序操作,发现共花费了328.125毫秒,我们知道1000毫秒等于1秒,也就是花了0.3秒,也就是说用5个线程去排序数组大是500个元素的数组共花费了0.3秒多,有一个问题是我一调用Thread.CurrentThread.Abort()这就话就报异常了,所以我把排序完的输出信息函数DisplayInfo放到了catch里,如果有人能告诉我为什么会报异常不甚感激

      

  • 相关阅读:
    又到了什么都不想做的时候了/梦
    【笔记】【汇编语言】第11章 标志寄存器
    【经验】【ORACLE】CMD命令行下使用SQLPLUS执行SQL脚本后返回CMD命令行的方法
    【笔记】【汇编语言】第6章 包含多个段的程序
    【笔记】【汇编语言】第8章 数据处理的两个基本问题
    【笔记】【汇编语言】第5章 [BX]和loop指令
    【经验】【ORACLE】从字符串中截取其中的数字
    【读书】【沉思录】卷一
    【笔记】【汇编语言】第9章 转移指令的原理
    【笔记】【汇编语言】第10章 CALL和RET指令
  • 原文地址:https://www.cnblogs.com/menglin2010/p/2446717.html
Copyright © 2020-2023  润新知