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有问题的可以在群里面提问。
  • 相关阅读:
    微信小程序反编译
    Mac 绑定Gitlab或者GitHub帐号,从新生成公钥
    Vue调试工具vue-devtools安装及使用
    NPM和Yarn添加淘宝镜像
    权限菜单设计
    Axure RP 7.0注册码
    Mac用户抓包软件Charles 4.0 破解 以及 抓取Https链接设置
    [转]c++导出函数dll供c#调用
    ef(EntityFramework)动态传递数据库连接字符串
    [转]sqlserver查询系统表统计表行数和占用空间
  • 原文地址:https://www.cnblogs.com/shiyh/p/14955867.html
Copyright © 2011-2022 走看看