• 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任务完成
            }    
  • 相关阅读:
    【LeetCode 104_二叉树_遍历】Maximum Depth of Binary Tree
    【LeetCode 110_二叉树_遍历】Balanced Binary Tree
    【LeetCode 111_二叉树_遍历】Minimum Depth of Binary Tree
    【剑指Offer】36两个链表的第一个公共结点
    【剑指Offer】34第一个只出现一次的字符
    【剑指Offer】33丑数
    【剑指Offer】32把数组排成最小的数
    xgboost的原理没你想像的那么难(转载)
    【剑指Offer】31整数中1出现的次数(从1到n整数中1出现的次数)
    【剑指Offer】28连续子数组的最大和
  • 原文地址:https://www.cnblogs.com/LTEF/p/9145012.html
Copyright © 2020-2023  润新知