zoukankan      html  css  js  c++  java
  • 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里,如果有人能告诉我为什么会报异常不甚感激

      

  • 相关阅读:
    [kuangbin带你飞]专题十二 基础DP1 E
    hdu 1203 I NEED A OFFER! (01背包)
    hdu 2602 Bone Collector (01背包)
    hdu 4513 吉哥系列故事——完美队形II (manacher)
    hdu 2203 亲和串 (KMP)
    hdu 1686 Oulipo (KMP)
    hdu 1251 统计难题 (字典树)
    hdu 2846 Repository (字典树)
    hdu 1711 Number Sequence (KMP)
    poj 3461 Oulipo(KMP)
  • 原文地址:https://www.cnblogs.com/menglin2010/p/2446717.html
Copyright © 2011-2022 走看看