java基础面试

一.java线程池的核心参数及工作原理

核心参数:

corePoolSize:核心线程数,当线程数小于该值时,线程池会优先创建新线程来执行任务,如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程,除非设置了allowCoreThreadTimeOut,否则核心线程将持续保留在线程池中即时没有新的任务提交过来。

maximumPoolSize:最大线程数,即线程池所能允许创建的最大线程数量。

keepAliveTime:空闲线程存活时间,当线程数量大于核心线程数时,这是多余空闲线程在终止之前等待新任务的最长时间。

unit:keepAliveTime数值的时间单位。

workQueue:任务队列,用于缓存未执行的任务,队列一直会持有任务直到有线程开始执行它。

threadFactory:线程工厂,可以通过工厂创建更具识别性质的线程,如线程名字等。

handler:拒绝策略,当线程和队列都处于饱和时就使用拒绝策略来处理新任务。

工作流程:

在这里插入图片描述

阻塞队列

构造函数中的队列允许我们自定义,队列的意义在于缓存无法得到线程执行的任务,当线程数量大于corePoolSize而当前workQueue还没有满时,就需要将任务放置到队列中。JDK提供了几种类型的队列容器,每种类型都具各自特点,可以根据实际场景和需要自行配置到线程池中。

ArrayBlockingQueue:

有界队列,基于数组结构,按照队列FIFO原则对元素排序;

LinkedBlockingQueue:

无界队列,基于链表结构,按照队列FIFO原则对元素排序,Executors.newFixedThreadPool()使用了这个队列;

SynchronousQueue:

同步队列,该队列不存储元素,每个插入操作必须等待另一个线程调用移除操作,否则插入操作会一直被阻塞,Executors.newCachedThreadPool()使用了这个队列;

PriorityBlockingQueue:

优先级队列,具有优先级的无限阻塞队列。

拒绝策略

拒绝策略(RejectedExecutionHandler)也称饱和策略,当线程数量和队列都达到饱和时,就采用饱和策略来处理新提交过来的任务,默认情况下采用的策略是抛出异常(AbortPolicy),表示无法处理直接抛出异常,其实JDK提供了四种策略,也很好记,拒绝策略无非就是抛异常、执行或者丢弃任务,其中丢弃任务就分为丢弃自己或者丢弃队列中最老的任务,下面简要说明一下:

AbortPolicy:丢弃新任务,并抛出 RejectedExecutionException

DiscardPolicy:不做任何操作,直接丢弃新任务

DiscardOldestPolicy:丢弃队列队首(最老)的元素,并执行新任务

CallerRunsPolicy:由当前调用线程来执行新任务

如何设置核心线程数的大小

性质不同的任务可以用不同规模的线程池分开处理。CPU密集型任务配置尽可能少的线程数量,如配置Ncpu+1个线程的线程池,以减少线程切换带来的性能开销。IO密集型任务则由于需要等待IO操作,线程并不是一直在执行任务,则配置尽可能多的线程,如2*Ncpu。混合型的任务,如果可以拆分,则将其拆分成一个CPU密集型任务和一个IO密集型任务,只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐率要高于串行执行的吞吐率,如果这两个任务执行时间相差太大,则没必要进行分解。我们可以通过Runtime.getRuntime().availableProcessors()方法获得当前设备的CPU个数。

二.synchronized工作原理

https://blog.csdn.net/javazejian/article/details/72828483

三.Threadlocal工作原理

https://blog.csdn.net/zhang_zhenwei/article/details/90051849?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

四.HashMap底层原理

https://my.oschina.net/u/2307589/blog/1800587

五.jdk8新特性

https://blog.csdn.net/wwwvipp/article/details/104040377

六.Java 中的IO

https://editor.csdn.net/md/?articleId=115122056

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值