C#中Thread、ThreadPool、Task等联系及区别

先说 Thread与ThreadPoll

前台线程:主程序必须等待线程执行完毕后才可退出程序。Thread默认为前台线程,也可以设置为后台线程

后台线程:主程序执行完毕后就退出,不管线程是否执行完毕。ThreadPool默认为后台线程

线程消耗:开启一个新线程,线程不做任何操作,都要消耗1M左右的内存

ThreadPoll是线程池 其目的是为了减少开启新线程消耗的资源(使用线程池中的空闲线程,不必在开启新线程,以及统一管理线程(线程池中的线程执行完毕后,回归到线程池里,等待新任务).

总结:ThreadPoll性能优于Thread,但是Thread和ThreadPoll对线程的控制都不是很好,例如线程等待(线程执行一段时间无响应后,直接停止线程,释放资源 等 都没有直接的API来控制 只能通过硬编码来实现,同时ThreadPool使用的是线程池全局队列,全局队列中的线程依旧会存在竞争共享资源的情况,从而影响性能。

WaitCallback waitCallback = new WaitCallback(MyThreadWork);
            ThreadPool.SetMaxThreads(6,6);
            ThreadPool.QueueUserWorkItem(waitCallback,"2");

            ThreadPool.QueueUserWorkItem(waitCallback,"3");

private static void MyThreadWork(object state) //2
        {
            Console.WriteLine("线程现在开始启动…… {0}", (string)state);
            Thread.Sleep(10000);
            Console.WriteLine("运行结束…… {0}", (string)state);
        }

然后task

Task的背后的实现也是使用了线程池线程,但它的性能优于ThreadPoll,因为它使用的不是线程池的全局队列,而是使用的本地队列,使线程之间的资源竞争减少。同时Task提供了丰富的API来管理线程、控制。但是相对前面的两种耗内存,Task依赖于CPU对于多核的CPU性能远超前两者,单核的CPU三者的性能没什么差别。

CancellationTokenSource cts = new CancellationTokenSource();
            for (int i = 0; i < 20; i++) {
                Task t = new Task(()=> OthreTask(cts));
                t.Start();
            }

            Thread.Sleep(5000);
            cts.Cancel(); //取消还未进行的task

private static void OthreTask(CancellationTokenSource cts)
        {
            if (!cts.IsCancellationRequested)
            {
                Console.WriteLine($"start");
                Thread.Sleep(10000);
                Console.WriteLine($"end");
            }
            else
            {
                Console.WriteLine($"提前结束");
            }
        }

我的总结:

ThreadPool可设置最大并发数 ThreadPool.SetMaxThreads(5,5); 为5.

网上说如果ThreadPool.SetMaxThreads方法中第二个参数completionPortThreads小于等于3 时,此时线程池不会阻塞,completionPortThreads大于3 时,线程池才会阻塞。亲测有效,但可能不使用所有环境。

猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/101031894