首页 > 其他分享 >tomcat线程池总结

tomcat线程池总结

时间:2022-12-21 11:33:22浏览次数:35  
标签:总结 Java tomcat 队列 创建 线程 ThreadPoolExecutor

一.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

相关文章

  • 开流运行多线程CompletableFuture
    CompletableFuture提高接口性能//根据排口查询因子信息(异步)CompletableFuture<List<FactorInfo>>listCompletableFuture=CompletableFuture.supplyAsyn......
  • XAMPP里tomcat启动报错:Make sure you have Java JDK or JRE installed and the requir
    ​​参考博客​​**1.运行命令行win+R在cmd中输入regedit出现下面的界面**2.在注册表中添加HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft/JavaDevelopmentKit3.成功界......
  • MySQL-线程池介绍
    一、为什么使用MySQL线程池1、减少线程重复创建与销毁部分的开销,提高性能线程池技术通过预先创建一定数量的线程,在监听到有新的请求时,线程池直接从现有的线程中分配一个......
  • Pandas中高效的选择和替换操作总结
    作为数据科学家,使用正确的工具和技术来最大限度地利用数据是很重要的。Pandas是数据操作、分析和可视化的重要工具,有效地使用Pandas可能具有挑战性,从使用向量化操作到利用......
  • 索引下推总结
    索引下推(indexconditionpushdown)简称ICP,在Mysql5.6的版本上推出,用于优化查询。在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎......
  • 高并发架构设计经验总结
      高并发解决的核心问题是在同一时间上有大量的请求过来,然后我们的系统要怎么抗住这些请求带来的压力。本文从基础设施层、服务端架构层、服务应用层分别做了一个简单......
  • 高并发架构设计经验总结
      高并发解决的核心问题是在同一时间上有大量的请求过来,然后我们的系统要怎么抗住这些请求带来的压力。本文从基础设施层、服务端架构层、服务应用层分别做了一个简单......
  • 初识Tomcat
    Tomcat学习归纳1.web认识:web服务器(主机)供浏览器访问的资源(静态资源,动态资源)2.学习JavaWeb开发,必须要先装WEB服务软件(Tomcat本质就是一个Java程序,但是这个Java......
  • 吃透JAVA的Stream流操作,多年实践总结
    在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。例如,现在有这么一个需求:从给定句子......
  • Java多线程批量操作,居然有人不做事务控制?
    前言公司业务中遇到一个需求,需要同时修改最多约5万条数据,而且还不支持批量或异步修改操作。于是只能写个for循环操作,但操作耗时太长,只能一步一步寻找其他解决方案。具体......