美团20220908测开一面凉经
面试官的环境感觉很嘈杂,而且办公环境很一般,初印象不是很好。
一开始说了一下用的语言之类的,之后上来就开始问了一些Java框架sprint之类的。
八股文:
Java的线程池的主要参数有哪些?一般的工作流程是什么样的?
主要参数有7个,分别是下列:
- corePoolSize: 线程池中的常驻核心线程数
- maximumPoolSize 最大线程池参数
- keepAliveTime 任务结束后,线程存活该指定时间后才会被释放
- TimeUnit 线程存活时间参数的单位,常用s,ms
- BlockingQueue 队列,当核心线程用完时,任务放进队列
- ThreadFactory 线程工厂
- 丢弃策略 默认Abort,直接丢弃,并抛出异常
工作流程
1.在创建了线程池之后,等待提交过来的任务请求 2.当调用execute()方法添加一个请求任务的时候,线程池会做出如下判断: 3.如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个程序 4.如果正在运行的线程数量大于或者等于corePoolSize,那么将这个任务放入队列 5.如果这个时候队列满了并且正在运行的线程数量还小于maximumPoolSize,那么还是要创建非核心线程立刻执行这个任务 6.如果队列满了并且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝策略来执行 7.当一个线程完成任务的时候,它会从队列中取下一个任务来执行 8.当一个线程无事可做超过一定时间(keepAliveTime)时:线程会判断如果当前运行的线程数大于corePoolSize,那么这个线程就会被停掉。
当时候问了一个问题,就是如果阻塞队列是一个无界队列的话,那最大线程数还有意义嘛?
与有界队列相比,除非系统资源耗尽,否则无界的任务队列不存在任务入队失败的情况当有新的任务到来,系统的线程数小于corePoolSize时,则新建线程执行任务。当达到corePoolSize后,就不会继续增加,若后续仍有新的任务加入,而没有空闲的线程资源,则任务直接进入队列等待。若任务创建和处理的速度差异很大,无界队列会保持快速增长,直到耗尽系统内存
美团效率是真的快,昨天面完,今天就挂!