线程的创建和销毁都是很耗费时间的,如果小任务比较多(比如频繁的接入接出),每一个任务都创建一个线程的话,我们把执行该任务分为三个片段,T 运行的整个时间,T1线程创建的时间,T2 线程等待以及任务处理的时间,T3 线程销毁的时间
T=T1+T2+T3
如果任务很小,那么T1+T3 时间可能比T2的时间大很多,因此引入了线程池的概念,即每次在服务器里用一定数量的线程处理这些小任务,这样避免了线程的重复创建销毁,而把重心放在处理任务上。那么Java是怎么设计线程池的呢?
首先,需要有个BlockingQueue,负责存放小的任务,该BlockingQueue拥有生产者消费者容器的作用;
线程池有几个关键的参数,核心线程数、最大线程数,当线程池的线程数没有达到核心线程数时,新增一个任务就会创建一个线程,直到线程数达到核心线程数;当线程数达到核心线程数,如果此时任务队列里面的任务数目大于核心线程数,那么会创建新的线程直到最大线程数。
ThreadPool里面的start线程的方法是execute(任务)方法,该任务根据上面提到的线程池线程的数量采用不同的处理方式,当线程池的线程数量达到最大,任务提交后会放在Blockingqueue里面,根据生产者消费者模型,几个线程争抢Blockingqueue里面的任务,BlocingQueue有自动的类似wait、notify的机制,保证当线程池没有任务时候,所有的线程都处于wait()状态,当有任务的时候,会唤醒线程池里面的线程处理这些任务。
以上就是线程池的原理,参照源码理解的。