最后
面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典
- Java核心知识整理
Java核心知识
- Spring全家桶(实战系列)
- 其他电子书资料
Step3:刷题
既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
以下是我私藏的面试题库:
传参值为corePoolSize大小,支持定时及周期性任务执行
延期执行示例:调用schedule方法,三个参数:Task,Delay,TimeUnit
public class ScheduledThreadPool {
// corePoolSize = 2
private static ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
public static void main(String[] args) {
System.out.println("Thread - “+Thread.currentThread().getName()+” BEGIN "+ new Date());
service.schedule(new print(),5, TimeUnit.SECONDS);
service.shutdown();
}
static class print implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try{
System.out.println("Thread - “+Thread.currentThread().getName()+” Delay 5 second and sleep 2 second "+ new Date());
Thread.sleep(2000);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
结果:
定时执行示例:调用scheduleAtFixedRate方法,四个参数:Task,initialDelay,Period,TimeUnit
public class ScheduledThreadPool {
// corePoolSize = 1
private static ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
System.out.println("Thread - “+Thread.currentThread().getName()+” BEGIN "+ new Date());
service.scheduleAtFixedRate(new print(),5,3,TimeUnit.SECONDS);
}
static class print implements Runnable{
@Override
public void run() {
System.out.println("Thread - “+Thread.currentThread().getName()+” Delay 5 second and period 3 second "+ new Date());
}
}
}
结果:
(4) newCachedThreadPool
=======================
可缓存线程池,如果线程池长度超过处理需要,回收空闲线程,若无可回收,则新建线程。即若前一个任务已完成,则会接着复用该线程:
public class CachedThreadPool {
private static AtomicInteger num = new AtomicInteger(0);
private static ExecutorService service = Executors.newCachedThreadPool();
public static void main(String[] args) {
countSum c = new countSum();
for (int i = 0; i < 3; i++) {
try {
service.submit©;
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
}
service.shutdown();
}
static class countSum implements Runnable{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("Thread - “+Thread.currentThread().getName()+” countSum= "+num.getAndIncrement());
}
}
}
}
结果:Thread.sleep(1000)即sleep一秒,上个任务完成可继续复用该线程,不需要创建新的线程
若将Tread.sleep(1000)注释掉,你会发现有3个线程在跑
若感兴趣可以去了解一下它们的底层源码,对于CachedThreadPool而言,可新建线程最大数量为INTEGER.MAXIMUM
2 线程池底层原理
=========
以newFixedThreadPool为例
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);
}
线程池七大参数
-
corePoolSize:线程池中的常驻核心线程数
-
maximumPoolSize:线程池中能够容纳同时执行的最大线程数,必须大于1
-
keepAliveTime:多余的空闲线程的存活时间;当前池中线程数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余线程会被销毁
-
unit:keepAliveTime的单位
-
workQueue:任务队列,被提交但尚未执行的任务
-
threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程,一般默认
-
handler:拒绝策略,表示当队列满了,并且工作线程大于等于线程池的最大线程数时如何来拒绝请求执行的runnable的策略
线程池四大流程
1)创建线程池后,开始等待请求
2)当调用execute()方法添加一个请求任务时,线程池会做以下判断:
-
如果正在运行的线程数量小于corePoolSize,马上创建线程执行任务
-
如果正在运行的线程数量大于等于corePoolSize,将该任务放入等待队列
-
如果等待队列已满,但正在运行线程数量小于max,创建非核心线程执行任务
-
如果队列满了且正在运行的线程数量大于max,线程池会启动饱和拒绝策略
3)当一个线程完成任务时,会从等待队列中取下一个任务来执行
4)当空闲线程超过keepAliveTime定义时间,会判断:
-
如果当前运行线程大于corePoolSize,该线程销毁
-
所有线程执行完任务后,线程个数恢复到corePoolSize大小
3 线程池策略及分析
==========
Note:阿里巴巴JAVA开发手册:线程池不允许使用Executors去创建线程池,而是通过使用ThreadPoolExecutor的方式自定义线程池,规避资源耗尽的风险
Executors返回的线程池对象的弊端:
1)FixedThreadPool和SingleThreadPool:
允许请求队列长度为Integer.MAX_VALUE,可能会堆积大量请求导致OOM
2)CachedThreadPool和ScheduledThreadPool:
允许创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程导致OOM
拒绝策略
1)AbortPolicy
直接抛出RejectedExecutionException异常阻止系统正常运行
2)CallerRunsPolicy
"调用者运行"的调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量
3)DiscardPolicy
该策略抛弃无法处理的任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种策略
4)DiscardOldestPolicy
抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务
如何设置maximumPoolSize大小
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-6ehkew4D-1715372797597)]