2020腾讯面试题!附答案

一面:
集合有哪些:
List(ArrayList Linklist ) set(Set Treeset Hashset) map(Hashmap currentHashmap hashtable )
在这里插入图片描述

arraylist和linkedlist区别
一个是基于数组的实现 一个是基于的链表的实现

hashmap怎么扩容(多线程扩容为什么会死循环),put过程

出现的是链表的闭环。
在这里插入图片描述

concurrentHashMap 1.7和1.8

1.7是采用采用的还是分段锁的机制 1.8采用的是CAS机制来实现的。

接口和抽象类区别

JVM内存分区
在这里插入图片描述

新生代:
eden,survivor_from, survivor_to

垃圾回收算法:

三种 标记清除 复制算法 标记整理算法

PretenureSizeThreshold,maxTenuringThreshold(默认15)
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

1线程池状态
在ThreadPoolExecutor中定义了一个volatile变量,另外定义了几个static final变量表示线程池的各个状态:

volatile int runState;

static final int RUNNING = 0;

static final int SHUTDOWN = 1;

static final int STOP = 2;

static final int TERMINATED = 3;

runState表示当前线程池的状态,它是一个volatile变量用来保证线程之间的可见性;

下面的几个static final变量表示runState可能的几个取值。

当创建线程池后,初始时,线程池处于RUNNING状态;

如果调用了shutdown()方法,则线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕;

如果调用了shutdownNow()方法,则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务;

当线程池处于SHUTDOWN或STOP状态,并且所有工作线程已经销毁,任务缓存队列已经清空或执行结束后,线程池被设置为TERMINATED状态。

2任务的执行
ThreadPoolExecutor类中其他的一些比较重要成员变量:

rivate final BlockingQueue workQueue; //任务缓存队列,用来存放等待执行的任务

private final ReentrantLock mainLock = new ReentrantLock(); //线程池的主要状态锁,对线程池状态(比如线程池大小//、runState等)的改变都要使用这个锁

private final HashSet workers = new HashSet(); //用来存放工作集

private volatile long keepAliveTime; //线程存货时间

private volatile boolean allowCoreThreadTimeOut//是否允许为核心线程设置存活时间

private volatile int corePoolSize; //核心池的大小(即线程池中的线程数目大于这个参数时,提交的任务会被放进任务缓存队列)

private volatile int maximumPoolSize; //线程池最大能容忍的线程数

private volatile int poolSize; //线程池中当前的线程数

private volatile RejectedExecutionHandler handler; //任务拒绝策略

private volatile ThreadFactory threadFactory; //线程工厂,用来创建线程

private int largestPoolSize; //用来记录线程池中曾经出现过的最大线程数

private long completedTaskCount; //用来记录已经执行完毕的任务个数

1)首先,要清楚corePoolSize和maximumPoolSize的含义;

2)其次,要知道Worker是用来起到什么作用的;

3)要知道任务提交给线程池之后的处理策略,这里总结一下主要有4点:

如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;

如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;

如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;

如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。

3线程池中的线程初始化
默认情况下,创建线程池之后,线程池中是没有线程的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
腾讯面试题中的 "从0到1" 是一个常见的问题,它意味着从零开始建立一个完整的系统或项目。这个问题的目的是考察你在实践中解决问题的能力以及你对整个流程的理解。 回答这个问题时,你可以按照以下步骤进行: 1. 理解需求:首先,你需要明确你要构建的系统或项目的需求是什么。这包括功能需求、性能需求和用户需求等。你可以通过与相关人员沟通和分析市场情况来获取这些需求。 2. 规划和设计:在明确需求后,你需要进行系统的规划和设计。这包括确定系统的整体架构、模块划分、技术选型等。在这个阶段,你需要考虑到系统的可扩展性、可维护性和可测试性等方面。 3. 开发和实现:在规划和设计完成后,你可以开始具体的开发工作。这包括编写代码、实现功能、进行单元测试和集成测试等。在这个阶段,你需要根据需求和设计进行迭代开发,并及时调整和修复问题。 4. 验收和部署:完成开发后,你需要进行系统的验收和部署工作。这包括与用户或相关人员进行沟通,确保系统满足需求,并进行正式部署。在这个阶段,你需要进行系统的功能测试、性能测试和安全性评估等。 5. 运维和优化:系统上线后,你需要进行系统的监控和运维工作。这包括监测系统的运行状态、处理用户反馈和进行系统的优化和升级等。 总结起来,从0到1的过程是一个从需求理解到系统部署运行的全过程,需要综合考虑各种因素,包括技术、设计、开发、测试、运维等。在回答面试题时,你可以根据你的实际经验和项目经历来展示你的能力和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值