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

    1.线程Thread

    多线程的意义在于一个应用程序中,有多个执行部分可以同时执行;对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主线程就不会阻塞,可以继续往下执行;等到后台线程执行完毕,再通知主线程,然后做出对应操作!

    启动Thread线程

     1         static void Main(string[] args)
     2         {
     3             // 启动多线程
     4             Thread thread = new Thread(myThreadDemo);
     5             thread.IsBackground = true;
     6             thread.Start();
     7 
     8             for (int i = 0; i < 10; i++) // 主线程
     9             {
    10                 Console.WriteLine("main is working...");    
    11             }
    12             thread.Join();
    13         }
    14         
    15         static void myThreadDemo()
    16         {
    17             Console.WriteLine("  >> now statr thread....");
    18             Thread.Sleep(1000);
    19             Console.WriteLine("  >> thread is over..");
    20         }

    执行结果如图:

    Thread thread = new Thread(myThreadDemo);启动无参无返回值ThreadStart线程,等同于 Thread thread = new Thread(myThreadDemo);

    启动带参数Thread线程

     1         static void Main(string[] args)
     2         {
     3             // 启动多线程
     4             Thread thread = new Thread(new ParameterizedThreadStart(myThreadDemo));
     5             thread.IsBackground = true;
     6             thread.Start("Ronaldo");
     7 
     8             for (int i = 0; i < 10; i++) // 主线程
     9             {
    10                 Console.WriteLine("main is working...");    
    11             }
    12             thread.Join();
    13         }
    14 
    15         static void myThreadDemo(object name)
    16         {
    17             Console.WriteLine(name.ToString());
    18             Console.WriteLine("  >> now statr thread....");
    19             Thread.Sleep(1000);
    20             Console.WriteLine("  >> thread is over..");
    21         }    

    线程池

    使用ThreadStart与ParameterizedThreadStart建立新线程非常简单,但通过此方法建立的线程难于管理,若建立过多的线程反而会影响系统的性能。

    设想如果需要处理大量任务,例如网站后台对于HTTP请求的处理,那是不是要对每一个请求创建一个后台线程呢?显然这样对占用大量内存,而且频繁地创建的过程也会严重影响速度。为了应对这种情况,.net引入了线程池的概念。

    线程池会把创建的线程保存起来,在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。直到应用程序再次向线程池发出请求时,线程池里挂起的线程就会再度激活执行任务。这样既节省了建立线程所造成的性能损耗,也可以让多个任务反复重用同一线程,从而在应用程序生存期内节约大量开销。

    下面做个试验

    for (int i = 0; i < 10; i++)
    {
        ThreadPool.QueueUserWorkItem(m =>
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
        });
    }
    Console.Read();

    可以看到,虽然执行了10次,但并没有创建10个线程。

    ThreadPool可以使用工作者线程和委托类创建线程。

     

    Task

            static void Main(string[] args) 
            {
                //StartNew .NetFramework4.0
                Task t = Task.Factory.StartNew(() =>
                {
                    // Just loop.
                    int ctr = 0;
                    for (ctr = 0; ctr <= 10000; ctr++)
                    {
                        Thread.Sleep(1);
                    }
                    Console.WriteLine("Finished {0} loop iterations",
                                      ctr);
                });
                Console.WriteLine("go on");
                t.Wait();
    
                //StartNew .NetFramework4.5
                Task t2 = Task.Run(() =>
                {
                    // Just loop.
                    int ctr = 0;
                    for (ctr = 0; ctr <= 10000; ctr++)
                    {
                        Thread.Sleep(1);
                    }
                    Console.WriteLine("Finished {0} loop iterations",
                                      ctr);
                });
                Console.WriteLine("go on");
                //t2.Wait(); // 等待任务完成,再进行下次操作
    
                Task.WaitAll(); // 等待任一一个任务完成
                Console.WriteLine("where i am");
                Task.WaitAll(t2); // 等待t2任务完成
            }    
  • 相关阅读:
    88. Merge Sorted Array
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    83. Remove Duplicates from Sorted List
    82. Remove Duplicates from Sorted List II
    81. Search in Rotated Sorted Array II
    80. Remove Duplicates from Sorted Array II
    计算几何——点线关系(叉积)poj2318
  • 原文地址:https://www.cnblogs.com/LTEF/p/9145012.html
Copyright © 2011-2022 走看看