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有问题的可以在群里面提问。
  • 相关阅读:
    损失函数VS评估指标
    协程到底是什么?看完这个故事明明白白!
    一个故事看懂AI神经网络工作原理
    一个爬虫的故事:这是人干的事儿?
    深夜,我偷听到程序员要对session下手……
    突然挂了!Redis缓存都在内存中,这下完了!
    还不懂Redis?看完这个故事就明白了!
    可怕!公司部署了一个东西,悄悄盯着你!
    小白怎么入门网络安全?看这篇就够啦!
    CPU有个禁区,内核权限也无法进入!
  • 原文地址:https://www.cnblogs.com/shiyh/p/14955867.html
Copyright © 2011-2022 走看看