一个小公司一面的总结(挂了)

73 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

兜兜转转还是迎来了第一次面试,老实说,面完人还是蒙的(因为真的没准备好)特别是面经,还没怎么背,所以结果g了。

虽然g了吧,但是刚好当作尝试,所以有了这一篇总结。

自我介绍篇

面试第一步,当然是自我介绍了,那么怎么自我介绍呢?

你是不是一上来:面试官你好,我是xx,来自xx,我性格xxxxxx(按照自我评价说)?

打住,这太不优雅了。你交了简历,自我评价这个,面试官可以看见,没必要复述。

如何进行一个优雅的自我介绍呢?

基本信息+为什么选择这个专业+在校成绩(GPA或者一些证书)+为什么面试本公司(为什么会选择我们)

面试官你好,我是xx,来自xx。在校期间,我参与了xx项目,取得了怎么样的成绩,或者是,我通过什么样的契机,了解了xx(你面试的,比较java)然后对xx很有兴趣,所以通过书本网络自学过一段时间,对xxxx技术栈进行了xx学习。通过在xx了解到贵公司在招聘xx,我觉得我也基本符合面试标准,所以就选择参与本次面试(选择投了简历)。

自我介绍的精髓就是扣紧面试岗位。

基础知识篇

我当时第一个问题:线程和线程池区别

回答:什么是线程?什么是线程池,两个区别,使用场景

线程:线程是程序的最小指向单位,是程序实际运行的单位。提到线程,就需要说进程,那么线程和进程区别:首先,进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者。可以说,进程中包含了多个可以同时运行的线程。

image.png

在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。

线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。

线程池需要依赖一些参数来控制任务的执行流程,其中最重要的参数有:corePoolSize(核心线程数)、workQueue(等待队列)、maxinumPoolSize(最大线程数)、handler(拒绝策略)、keepAliveTime(空闲线程存活时间)

步骤:

  • 判断线程数是不是达到核心线程数,如果没有,新建线程。如果已经到了,转下一步
  • 判断等待队列是不是满了,如果没有,放入等待队列,如果满了,进入下一步
  • 判断线程数是不是到了最大线程数,如果没有,新建线程,如果有,转下一步
  • 因为已经到最大线程了,使用采用拒绝策略,拒绝指向该任务
  • 新建线程处理完当前任务后,不会立即关闭而是继续处理等待队列中的任务。如果线程的空闲时间达到了存活时间,则线程池会销毁一部分线程,将线程数量收缩至核心线程数大小。

拒绝策略主要有4个:让调用者自己执行任务、直接抛出异常、丢弃任务不做任何处理、删除队列中最老的任务并把当前任务加入队列。这4个拒绝策略分别对应着RejectedExecutionHandler接口的4个实现类,我们也可以基于这个接口实现自己的拒绝策略。

线程池的生命周期包含5个状态:RUNNING、SHUTDOWN、STOP、TIDING、TERMINATED。这5种状态的状态值分别是:-1、0、1、2、3。 在线程池的生命周期中,它的状态只能由小到大迁移,是不可逆的。

  1. RUNNING:表示线程池正在运行。

  2. SHUTDOWN:执行shutdown()时进入该状态,此时队列不会清空,线程池会等待任务执行完毕。

  3. STOP:执行shutdownNow()时进入该状态,此时现线程池会清空队列,不再等待任务的执行。

  4. TIDING:当线程池及队列为空时进入该状态,此时线程池会执行钩子函数,目前该函数是一个空的实现。

  5. TERMINATED:钩子函数执行完毕后,线程进入该状态,表示线程池已经死亡。

区别

  1. 线程每次使用需要new,新加对象性能差,但是线程池可以重复使用线程,减少了线程新加的开销。
  2. 线程缺乏管理,多个线程之间互相竞争资源,可能占用过多系统资源导致死机,线程池可以控制最大并发数,提高了系统的使用率,同时避免过多资源竞争,避免堵塞
  3. 线程缺乏定时指向等功能,线程池提供定时执行、定期执行、单线程、并发数控制等功能

线程池使用场景

  • newCachedThreadPool:当有新任务到来,则插入到队列中,由于是同步队列,因此会在池中寻找可用线程来执行,若有可用线程则执行,若没有可用线程则创建一个线程来执行该任务;若池中线程空闲时间超过指定大小,则该线程会被销毁。
  • newFixedThreadPool创建可容纳固定数量线程的池子,每个线程的存活时间是无限的,当池子满了就不再添加线程了;如果池中的所有线程均在忙状态,对于新任务会进入阻塞队列中(无界的阻塞队列)
  • newSingleThreadExecutor创建只有一个线程的线程池,且线程的存活时间是无限的;当该线程正繁忙时,对于新任务会进入阻塞队列中(无界的阻塞队列)
  • NewScheduledThreadPool创建一个固定大小的线程池,线程池内线程存活时间无限制,线程池可以支持定时及周期性任务执行,如果所有线程均处于繁忙状态,对于新任务会进入DelayedWorkQueue队列中,这是一种按照超时时间排序的队列结构

乐观锁和悲观锁

image.png

多线程并发

同步和互斥

同步:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据。

互斥:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。

image.png

Java实现多线程:继承Thread,实现runnable,使用内部类,定时器,带返回值的线程实现,基于线程池实现。

同步锁和互斥锁有什么区别

互斥就是线程A访问了一组数据,线程BCD就不能同时访问这些数据,直到A停止访问了 同步就是ABCD这些线程要约定一个执行的协调顺序,比如D要执行,B和C必须都得做完,而B和C要开始,A必须先得做完。

java线程安全的容器

image.png

ip

IP是整个TCP/IP协议组的核心,也是构成互联网的基础。IP位于TCP/IP模型的网络层(相当于OSI模型的网络层),它可以向传输层提供各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。

项目篇

首先项目干嘛的,基于什么背景,实现什么需求,负责什么板块,使用了什么技术,大致实现流程。

遇到的问题大部分是针对项目使用的技术来问,我因为前面g了,所以项目没来得及问