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 时,线程池才会阻塞。亲测有效,但可能不使用所有环境。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值