为何须要线程池呢,没想明白这个问题,看再多线程池的源码都没有用,先要知道线程池技术解决了什么问题,才能看的懂源码,由于全部的代码都是为了解决实际的工程问题。java
抛几个问题,看看你是否知道,不知道的话,可能你对线程池的理解还不够深刻,仍是只知其一;不知其二。那么本文会对你有用,请继续看下去程序员
在大学里咱们学习c语言时,一个main函数写到底,就能够交做业了。刚开始工做时,mvc一路controller -> service -> dao就OK了。可是工做中写代码是要解决实际问题的。你啪啪啪写完了代码,用户发现你这个接口响应太慢了,怎么办?多线程
用户提交任务到程序执行完成,大体的过程如上图,提交一个task,而后有个线程去执行。
因此要提升程序执行的效率能够从两个方面来考虑并发
本篇说的线程池主要就是从1的维度来提升程序执行的效率mvc
有必定工做经验的朋友对消息队列的削峰填谷,系统解耦确定不陌生。那么线程池,算不算削峰填谷呢?
异步化后,至关于把全部的task放在了队列中。也就是生产者 -> 容器 -> 消费者。以下图
从图能够看出,线程池技术使系统复杂了,也提供了更多的灵活性。经过队列的形式,咱们将任务的执行拆分红了生产者,消费者模式。每一步只用关心本身的事情。若是咱们的任务很复杂,咱们能够将任务拆分红不一样的步骤,每一步骤可使用不一样的线程池来解决,以此来提升效率。异步
看上去经过线程池完美解决了咱们的问题,那么须要付出什么代价呢?cpu的资源是有限的,线程的建立也须要代价
,咱们一个java应用进程的资源是毕竟是有限的。咱们不可能在应用中无限的建立线程池。因此咱们须要管理线程池。函数
一般,对于简单的应用,咱们使用一个单例线程池便可,让应用中的全部task都使用同一个线程池,防止一些初级程序员在应用中随意建立线程池,致使线程资源吃紧,线程占用过多的资源。学习
当应用中task比较复杂的时候,咱们就须要使用分治的思想,对线程池进行隔离。
好比有些是cpu密集型的,有些是IO密集型的;任务的重要程度也有轻重之分;任务的执行时间也有不一样。咱们须要对为这些任务创建不一样的线程池,以此来提升效率。线程
线程池是一种异步化技术,经过预先建立线程/异步处理来提升响应速度。同时经过统一调配线程资源,能够下降线程的重复建立问题,提升线程的利用率,中心化管理有利于对资源的有效控制,防止滥用。code
关注【方丈的寺院】,与方丈一块儿开始技术修行之路