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有问题的可以在群里面提问。
  • 相关阅读:
    Spring(二) Spring装配Bean的几种方式
    Spring(一) Spring配置文件中classpath和classpath*的区别
    学习响应式编程 Reactor (5)
    学习响应式编程 Reactor (4)
    学习响应式编程 Reactor (3)
    学习响应式编程 Reactor (2)
    学习响应式编程 Reactor (1)
    学习Java 8 Stream Api (5)
    学习Java 8 Stream Api (4)
    Spring WebFlux 学习笔记
  • 原文地址:https://www.cnblogs.com/shiyh/p/14955867.html
Copyright © 2011-2022 走看看