饭店的运作模式(线程、线程池、任务)
前台线程(服务员、大堂经理):主程序必须等待线程执行完毕后才可退出程序。Thread默认为前台线程,也可以设置为后台线程
后台线程(厨师、配菜):主程序执行完毕后就退出,不管线程是否执行完毕。ThreadPool默认为后台线程
所有前台线程停止运行时,CLR强制终止仍在运行的任何后台线程,后台线程被直接终止;不抛出异常。(前台服务员都停止工作了,说明客户都走光了。你后台厨师、配菜还忙个什么劲!)
线程消耗:开启一个新线程,线程不做任何操作,都要消耗1M左右的内存(这些个服务员、大堂经理、厨师什么活都不干,会白吃、白喝、白拿工资的)
ThreadPoll是线程池(一个饭店的服务员、厨师、配菜) 其目的是为了合理利用线程资源(使用线程池中的空闲线程,不必在开启新线程,以及统一管理线程(线程池中的线程执行完毕后,回归到线程池里,等待新任务).(一个服务员可以服务多个桌顾客请求,如果忙不过来就不断叫新的服务员过来,一个服务员忙完。就回去等待下一个任务分配)
总结:ThreadPoll性能优于Thread,但是Thread和ThreadPoll对线程的控制都不是很好,例如线程等待(线程执行一段时间无响应后,直接停止线程,释放资源 等 都没有直接的API来控制 只能通过硬编码来实现,同时ThreadPool使用的是线程池全局队列,全局队列中的线程依旧会存在竞争共享资源的情况,从而影响性能。
然后task(一个会利用时间的好厨师)【厨师(线程),同时处理多个任务:蒸鱼(方法A)的同时,又去做其他菜(任务B),等蒸鱼做好(方法A返回)继续接收返回给】
Task的背后的实现也是使用了线程池线程,但它的性能优于ThreadPoll,因为它使用的不是线程池的全局队列,而是使用的本地队列,使线程之间的资源竞争减少。同时Task提供了丰富的API来管理线程、控制。但是相对前面的两种耗内存,Task依赖于CPU对于多核的CPU性能远超前两者,单核的CPU三者的性能没什么差别。