zoukankan      html  css  js  c++  java
  • Task 和Thread在效率上有什么区别

    Task运行带参数的函数

      Task<Int32>   task = Task.Run(() => fun("s", 9));

    函数定义:

       private Int32 frun(string s, int m)
            {
            
                return 0;
            }

    using System;
    using System.Threading;
    using System.Threading.Tasks;
     
    namespace ConsoleApplication1
    {
        static class Program
        {
            static void Main(string[] args)
            {
                for (var i = 1; i <= 50; i++)
                    TestTask(i);
                for (var i = 1; i <= 50; i++)
                    TestThreadPool(i);
                for (var i = 1; i <= 50; i++)
                    TestThread(i);
                Console.ReadLine();
            }
     
            private static void TestThread(int i)
            {
                Console.WriteLine("Thread {0} start.", i);
                new Thread(h =>
                {
                    Thread.Sleep(5000);
                    Console.WriteLine("-------------------Thread {0} end.", i);
                }).Start();
            }
     
            private static void TestThreadPool(int i)
            {
                Console.WriteLine("ThreadPool {0} start.", i);
                ThreadPool.QueueUserWorkItem(h =>
                  {
                      Thread.Sleep(5000);
                      Console.WriteLine("-------------------ThreadPool {0} end.", i);
                  });
            }
     
            private static void TestTask(int i)
            {
                Console.WriteLine("Task {0} start.", i);
                new Task(() =>
                {
                    Thread.Sleep(5000);
                    Console.WriteLine("-------------------Task {0} end.", i);
                }).Start();
            }
        }
     
     
    }
    可以看看谁最先打印 ------------------end。 你可以看到,Thread 完胜 Task。

    这只是因为Task是用了线程池来控制的,开始的时候线程池内只有默认数量的线程,随着任务增多线程池在增大容量(具体策略不太了解),所以后面几个线程启动晚了。 而Thread是全部一起启动的,所以几乎同时完成。 这是出于稳定性考虑的设计,Task的设计是用来解决实际问题的,比如网络下载、数据读写,瓶颈在于网络或存储的速度,并且要保证稳定。 上面的测试太理论,没有太多实际意义 当然引起思考的作用还是有的...

    TASK注重点在并行~ 所以如果你是工作在多核情况下,那么task或许是你最好的选择了,但是thread却无法实现自动化的并行操作~ task是基于threadPool的,所以相比thread来说,就算再单核,我也依然觉得task这种方式会比thread强~

    JAVA&NET技术QQ群号:456257217有问题的可以在群里面提问。
  • 相关阅读:
    gcc开启C99或C11标准支持
    数组作为参数的四种声明方式
    [BZOJ 2654]tree(陈立杰)
    [HNOI 2014]道路堵塞
    [ZJOI 2006]书架
    [NOI 2010]超级钢琴
    汇编语言语法
    [洛谷P1714]切蛋糕
    [洛谷P1440]求m区间内的最小值
    [NOIP2016 TG D2T3]愤怒的小鸟
  • 原文地址:https://www.cnblogs.com/shiyh/p/14955867.html
Copyright © 2011-2022 走看看