一.tomcat线程池
在开发中我们经常会碰到“池”的概念,比如数据库连接池、内存池、线程池、常量池等。为什么需 要“池”呢?程序运行的本质,就是通过使用系统资源(CPU、内存、网络、磁盘等)来完成信息的处理, 比如在JVM中创建一个对象实例需要消耗CPU和内存资源,如果你的程序需要频繁创建大量的对象,并且这 些对象的存活时间短,就意味着需要进行频繁销毁,那么很有可能这部分代码会成为性能的瓶颈。 而“池”就是用来解决这个问题的,简单来说,对象池就是把用过的对象保存起来,等下一次需要这种对象 的时候,直接从对象池中拿出来重复使用,避免频繁地创建和销毁。在Java中万物皆对象,线程也是一个对 象,Java线程是对操作系统线程的封装,创建Java线程也需要消耗系统资源,因此就有了线程池。JDK中提 供了线程池的默认实现,我们也可以通过扩展Java原生线程池来实现自己的线程池。 同样,为了提高处理能力和并发度,Web容器一般会把处理请求的工作放到线程池里来执行,Tomcat扩展 了原生的Java线程池,来满足Web容器高并发的需求,下面我们就来学习一下Java线程池的原理,以及 Tomcat是如何扩展Java线程池的。
jdk提供的线程池
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
执行流程:
每次提交任务时,如果线程数还没达到核心线程数corePoolSize,线程池就创建新线程来执行。当线程数达 到corePoolSize后,新增的任务就放到工作队列workQueue里,而线程池中的线程则努力地从workQueue 里拉活来干,也就是调用poll方法来获取任务。 如果任务很多,并且workQueue是个有界队列,队列可能会满,此时线程池就会紧急创建新的临时线程来 救场,如果总的线程数达到了最大线程数maximumPoolSize,则不能再创建新的临时线程了,转而执行拒 绝策略handler,比如抛出异常或者由调用者线程来执行任务等。 如果高峰过去了,线程池比较闲了怎么办?临时线程使用poll(keepAliveTime, unit)方法从工作队列中拉 活干,请注意poll方法设置了超时时间,如果超时了仍然两手空空没拉到活,表明它太闲了,这个线程会被 销毁回收。
Java提供了一些默认的线程池实现,比如FixedThreadPool和CachedThreadPool,它们的本质就是给 ThreadPoolExecutor设置了不同的参数,是定制版的ThreadPoolExecutor。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
从上面的代码你可以看到:
fixedThreadPool有有固定长度(nThreads)的线程数组,忙不过来时会把任务放到无限长的队列里,这是 因为LinkedBlockingQueue默认是一个无界队列。
cachedThreadPool的maximumPoolSize参数值是Integer.MAX_VALUE,因此它对线程个数不做限制, 忙不过来时无限创建临时线程,闲下来时再回收。它的任务队列是SynchronousQueue,表明队列长度为 0。
为什么jdk提供了线程池,tomcat还要自定义线程池,是因为jdk提供的线程池是cpu类型的(cpu计算类型的任务处理较快,处理完了可以去queue再取task),而tomcat 处理的请求大多数io相关的,如果核心线程满了,就入队,那io请求就会被阻塞,所以tomcat是线程个数到最大线程数之后,才会进队列,这个和jdk的有点区别
标签:总结,Java,tomcat,队列,创建,线程,ThreadPoolExecutor From: https://www.cnblogs.com/jelly12345/p/16995879.html