Java中各种池_闭关待面试的博客-优快云博客
目录
**创建线程池的方式--面试//**常见线程池有哪些--面试
*连接池
**什么是连接池 分重释
连接池是用来 分配、管理、释放 数据库连接的。
可以使程序重复使用同一个数据库连接,不用每次都创建一个新的数据库连接;
通过释放空闲时间较长的 数据库连接,避免因为创建太多的连接造成的连接遗漏问题
**工作机制
1、服务器启动时会建立一定数量的连接,并一直维持不少于此数目的连接。
2、当客户请求到来时,从池中取出一个空闲连接为客户服务并将其标记为忙;
如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定
3、当使用的连接 为客户服务完成后,会被标记为空闲
4、当连接数量达到连接池最大值时候,池驱动程序将不再创建新连接,只能等连接空闲以后重用已有的连接。
**mysql数据库
*线程池
**什么是线程池 分重限
线程池是用来 分配、管理 线程的。
可以使程序重复使用同一个线程,不用每次都创建一个新的线程;
通过限制程序执行线程的数量,避免创建太多的线程造成资源消耗过多的问题
线程池是一个容纳多个线程的容器,其中的线程可以反复使用,避免频繁创建线程对象而消耗过多资源。
限制系统中执行线程的数量——并发的线程数量很多时,频繁创建线程就会降低系统的效率,可以通过线程池来避免这些问题
**工作机制
工作流程简述:
1、当客户请求到来时,如果核心线程数未满且没有空闲的核心线程,那么就创建一个核心线程来处理这个任务。
2、如果核心线程数满了,就把请求放到任务队列中等待执行。
3、如果任务队列也满了,但是线程池中的线程数量小于最大线程数,就创建一个非核心线程来处理请求。
4、如果此时达到了最大线程数的限制,则执行饱和策略。
工作流程简述:
1、当客户请求到来时,如果当前核心线程的数量小于核心线程的阈值并且没有空闲的核心线程,那么就创建一个核心线程来处理这个任务。
2、如果核心线程数满了,就把请求放到任务队列中等待执行。
3、此时如果任务队列也满了,但是线程池中的线程数量小于最大线程数,则创建非核心线程来处理请求。
4、如果此时达到了最大线程数的限制,则执行饱和策略。
当客户请求到来时
1. 线程池首先判断核心线程池里的线程是否已经满了。如果不是,则创建一个新的工作线程来执行任务。否则进入2.
2. 判断工作队列是否已经满了,倘若还没有满,将线程放入工作队列。否则进入3.
3. 判断线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行。如果线程池满了,则交给饱和策略来处理任务。
当客户请求到来时,就从线程池中取出一个空闲的线程为客户服务,
服务完成后不关闭该线程,而是将该线程还回到线程池中。
在线程池的编程模式下,请求是提交给整个线程池,而不是直接交给某个线程,线程池在拿到请求后, 它就在内部找有无空闲的线程,再把任务交给内部某个空闲的线程。
一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。
**创建线程池的方式--面试//**常见线程池有哪些--面试
线程池四种创建方式
Java通过Executors(jdk1.5并发包)提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。不会回收,会一直占用资源
newScheduledThreadPool (si gai 住 哦的)创建一个定时任务线程池
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程按照指定顺序来执行任务
常用线程池
①newSingleThreadExecutor
单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
②newFixedThreadExecutor(n)
固定数量的线程池,每提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
③newCacheThreadExecutor(推荐使用)
可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
④newScheduleThreadExecutor
大小无限制的线程池,支持定时和周期性的执行线程
线程池常用参数
corePoolSize:核心线程数量,会一直存在,除非allowCoreThreadTimeOut设置为true
maximumPoolSize:线程池允许的最大线程池数量
keepAliveTime:线程数量超过corePoolSize,空闲线程的最大超时时间
unit:超时时间的单位
workQueue:工作队列,保存未执行的Runnable 任务
threadFactory:创建线程的工厂类
handler:当线程已满,工作队列也满了的时候,会被调用。被用来实现各种拒绝策略
**进程线程
*字符串常量池
**什么是字符串常量池
利用String创建字符串对象,第一次创建会存在堆内存的常量池中;第二次创建相同的字符串对象时会直接使用,不会再次创建 两次的地址值相同
**API
*整数常量池
**什么是整数常量池
java中为了提高程序的执行效率,将[-128, 127]之间256个整数所有的包装对象 类加载时就已经提前创建好了,放在了堆内存的“整数常量池”当中。
包装类型Integer的创建方式2
Integer i2 = Integer.valueOf(5); 会自动装箱,所以可以省略Integer.valueOf
有高效的效果,数据在-128~127的范围内,才有高效的效果——整数常量池
Integer对象创建方式2有一个高效的效果,但是要求:
* 1.是Integer类型--/*只有Integer才有高效的效果,Double是没有的*/
* 2.使用valueOf()的创建方式-()里需要传一个int类型的参数
* 3.数据在-128~127范围内
* 只要满足以上3个条件,相同的数据只会存一次,后续再存都是使用之前创建好的数据
2)最终版 因为会自动装箱Integer i3 = 5; 自动装箱:编译器会把int类型5装箱,变成Integer,底层自动调用的方法:valueOf(5)
结论:
Integer a = -128;
Integer b = -128;
则a和b指向整数常量池中的同一个对象,不会new两次对象