1.自我介绍
2.说说项目以及由项目问题
3.线程池的种类
1.固定数量的线程池:这个比较好理解,即线程的数量是固定的,线程并不会随着任务的多少而变化。可以发现他最终是通过实例化ThreadPoolExecutor来实现。
2.并行线程池:这个是1.8中新加入的线程池,可以看到主要使用了ForkJoin相关的操作
3.只有一个线程的线程池:其实这个可以不称为线程池,因为只有一个线程。核心线程=最大线程=1,这个比较适合需要保证队列中任务顺序执行的场景。
4.缓存线程池:他根据需要创建线程,没有核心线程,当60s内没有任务时,将会回收存活的线程,60s内有任务时,他可以重用已有的线程。注意他的工作队列是SynchronousQueue,这里简单的说一下,他的每一个put操作必须等待take操作,这意味着如果任务生产速度大于消费速度,那么他将不会创建新线程。该线程池适合执行大量小任务的场景。
5.延时线程池:ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,所以super最终会调到ThreadPoolExecutor的构造函数,可以看到,最大线程数为int最大值,工作队列为延时队列DelayedWorkQueue,该线程池适合执行延时任务。
五种线程池的使用场景
-
newSingleThreadExecutor:一个单线程的线程池,可以用于需要保证顺序执行的场景,并且只有一个线程在执行。
-
newFixedThreadPool:一个固定大小的线程池,可以用于已知并发压力的情况下,对线程数做限制。
-
newCachedThreadPool:一个可以无限扩大的线程池,比较适合处理执行时间比较小的任务。
-
newScheduledThreadPool:可以延时启动,定时启动的线程池,适用于需要多个后台线程执行周期任务的场景。
-
newWorkStealingPool:一个拥有多个任务队列的线程池,可以减少连接数,创建当前可用cpu数量的线程来并行执行。
线程池任务执行流程:
-
当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
-
当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
-
当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
-
当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
-
当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
-
当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭
4.如何创建线程
1)继承Thread类创建线程
2)实现Runnable接口创建线程
3)使用Callable和Future创建线程
4)使用线程池例如用Executor框架
5java多态的体现
子类对象指向父类的应用。实现对父类方法的重写。
是一种的动态的绑定技术。是指的是在执行期间而不是编译期间判断对象的实际类型调用相关的方法。多态就是一个行为具有多个不同的变现的形式或者是形态的能力。多态就是同一个接口使用不同实例进而实现不同的操作。
多态的概念:同一操作作用于不同对象,可以有不同的解释,有不同的执行结果,这就是多态,简单来说就是:父类的引用指向子类对象。
6.笔试最长递增子串的长度的思路:动态规划
public int findLengthOfLCIS(int[] nums) {
if (nums.length == 0) {
return 0;
}
int result = 1;
int length = 1;
//遍历 一次比较大小
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
length++;
result = result >= length ? result : length;
} else {
length = 1;
}
}
return result;
}
新网银行 大数据算法实习面经
一面:
1,RF的原理,和选用理由
2,过拟合的原因是什么,从数据分布的角度解释
3,rf和boosting算法的区别
4,10亿个数选最大的K个,用什么方法,复杂度多少 。分而治之的思想
5,有开发经验吗,sql会吗
6, 25匹马赛跑经典智力题
二面:
2是在一个矩阵中返回最大的正方形大小。我当时想的就是最简单的方法。
模拟高铁卖票和验票的问题,怎么编写方法去读取买票和验票的文件,验证验票和买票文件。开共享面板,编码实现这个流程。
二面:
1.给一个递增的数组,需要找到索引和值相等的值并返回,怎么找?(我回答的是二分查找,提示说怎么确定查找的值,构造一个(值减索引)的数组就可以二分)
2.给一个只能够生成3以内整数的随机函数rand(3),问怎么实现rand(5)?(我最先想的是两次rand(3)求和去掉6,面试官提示说要每个数出现的概率相等,想了一下用if else就可以做到
微众大数据实习一面组件部署
项目实现细节
起了几个Task?
用的Standalone、YARN还是K8S?原理的是什么
聊聊HBase,读流程,写流程
HLog写入失败了怎么办
如果Region挂了怎么办,那怎么恢复呢?
MemoStore刷不到HFile里怎么办?
Flink的excatly-one是怎么实现的?
如果在这个过程中,Task挂掉了怎么办?
checkpoint精准一次跟source和sink有关系吗?
反射机制的实现原理
JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类信息以及动态调用对象内容就称为java语言的反射机制。
原理是:我们知道,要使用一个类,就要先把它加载到虚拟机中,生成一个Class对象。这个class对象就保存了这个类的一切信息。反射机制的实现,就是获取这个Class对象,通过Class对象去访问类、对象的元数据以及运行时的数据。有三种方法获得类的Class对象:Class.forName(String className)、className.class、实例对象.getClass();
Java的反射机制:操作的就是这个对象的.class文件,首先加载相应类的字节码(运行eclipse的时候,.class文件的字节码会加载到内存中),随后解剖(反射 reflect)出字节码中的构造函数、方法以及变量(字段),或者说是取出。
Java有哪些比较熟的?:内存模型 jvm的相关模型
常见的集合框架
介绍一下优先队列
说说HashMap由什么构成的 :数组+链表+红黑树
扩容机制 :大于0.75的整个长度的时候就扩容,先申请2倍的长度的数组 再将原来的数据复制到现在的,在并将整个数据添加其
怎么产生闭环死锁的?:多线程的时候,由于是1.7之前采用的是的头部插入法,所在在多线程的时候可能出现的是封闭的闭环。
1.8之后还存在吗?为什么?不存在,由于采用的是的尾部插入方法。但是存在的是数据的丢失。所以改进为CAS+node+Synchronized
那ConcurrentHashMap怎么实现线程安全的?:1.7前采用的分段锁的机制,但是1.8以后采用的是CAS+node+Synchronized机制来实现的
TCP和IP的区别
虚拟内存:虚拟内存能代替内存吗?
算法题:
1实现一个random(m,n)方法,返回m到n的随机数
m
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?