并发编程1-线程池实现原理解析

1、线程池的实现原理:

1)、当线程池初始化时,线程池里没有线程,当提交一个任务到线程池后,判断核心线程池里的线程数是否达到corePoolSize,如果没有则进行创建一个新的工作线程来执行任务。

2)、如果核心线程池已经满,则把任务准备添加到工作队列,判断工作队列是否已经满,如果没有满添加到工作队列等待线程来取;工作中的线程完成工作后会从工作队列取新的任务进行执行;

3)、如果工作队列满了则判断线程池线程线程数是否达到maximumuPoolSize,如果没有达到进行创建一个新的工作线程来执行任务。

4)、如果工作队列是有界队列,在工作队列满后,如果线程数已经达到maximumuPoolSize,则会把任务交给包含策略来处理。

5)、线程消亡,参数keepAliveTime配置为0时多余空闲线程会立即消亡,到配置60时,意味等待新任务最长时间为60S,超过60S空闲线程将销毁。

2、在不同的业务场景中,线程池参数如何设置?

性质不同的任务可以用不同的线程池分开处理。1)、CPU密集性的任务应尽量配置小的线程,如配置N(cpu)+1;2)、IO密集性的任务,由于IO阻塞线程不是一直在执行,则可以配置尽可能多的线程,如2*N(CPU)。3)、混合型的任务,如果可以拆分的话,将其拆分成一个CPU密集型的和一个IO密集性的任务,这样并发任务获得比较高的吞吐量。4|、有优先级不同的任务可以使用优先级队列来初始化线程池,让任务优先级高的任务优先执行。5)、依赖数据库连接池的任务,因为线程提交SQL后需要等待数据库结果返回,等待的时间越长,则CPU的空闲时间越长,那么线程数应该设置的越大。6)、建议使用有界队列初始化线程池。

3、线程池一般通过Executor框架进行工厂创建。

线程参数:

corePool、maximumPool、BlockingQueue、keepAliveTime、RejectedExceptionHandler




你可能感兴趣的:(Java,并发)