互联网大厂Java面试:核心知识大考验
面试官:请简要介绍一下Java中的多线程机制以及如何创建一个线程。
王铁牛:多线程就是多个线程同时执行嘛。创建线程可以通过继承Thread类或者实现Runnable接口。比如说继承Thread类,重写它的run方法,然后new一个对象调用start方法就启动线程了。
面试官:回答得还不错。那说说线程池的核心参数以及它们的作用。
王铁牛:线程池有几个核心参数,corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。corePoolSize是核心线程数,maximumPoolSize是最大线程数,keepAliveTime是线程在超出核心线程数后,在workQueue满了的情况下,线程在多长时间后会被销毁,unit就是这个时间的单位,workQueue是任务队列,threadFactory是线程工厂,handler是拒绝策略。
面试官:很好。再问一个,简述一下JVM的内存结构。
王铁牛:JVM内存结构包括堆、栈、方法区。堆是存放对象实例的地方,栈是存放局部变量等,方法区存放类信息、常量、静态变量等。
第一轮结束。
面试官:讲讲Spring框架中IoC和AOP的概念。
王铁牛:IoC就是控制反转,把对象的创建和依赖注入交给Spring容器来管理。AOP就是面向切面编程,能在不修改原有代码的基础上,动态地将一些功能切入到方法执行前后等位置。
面试官:那Spring Boot的自动配置原理是什么?
王铁牛:Spring Boot通过@EnableAutoConfiguration注解开启自动配置,它会根据类路径下的依赖来自动配置相关的Bean。
面试官:MyBatis的动态SQL有哪些?
王铁牛:有if、where、trim、choose、when、otherwise、foreach等。
第二轮结束。
面试官:Dubbo的集群容错策略有哪些?
王铁牛:有failover、failfast、failsafe、failback、forking、broadcast。
面试官:RabbitMq的消息确认机制是怎样的?
王铁牛:有生产者确认和消费者确认。生产者确认包括事务机制和发送方确认,消费者确认有自动确认和手动确认。
面试官:xxl-job的执行器有哪些类型?
王铁牛:有单机执行器、集群执行器等。
第三轮结束。
面试官:今天的面试就到这里,回去等通知吧。
答案:
- 多线程:多线程是指程序中包含多个执行单元,这些执行单元可以并发执行。创建线程的方式主要有两种:继承Thread类,重写run方法,然后通过实例对象调用start方法启动线程;实现Runnable接口,实现其run方法,将实现类实例作为参数传入Thread类的构造函数创建线程对象并调用start方法启动。
- 线程池核心参数:
- corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。
- maximumPoolSize:最大线程数,当任务数超过corePoolSize且workQueue已满时,会创建新线程直到线程数达到maximumPoolSize。
- keepAliveTime:线程在超出核心线程数后,在workQueue满了的情况下,线程在多长时间后会被销毁。
- unit:keepAliveTime的时间单位。
- workQueue:任务队列,用于存放提交的任务。
- threadFactory:线程工厂,用于创建线程。
- handler:拒绝策略,当线程数达到maximumPoolSize且workQueue已满时,用于处理新提交的任务。
- JVM内存结构:
- 堆:是存放对象实例的地方,是JVM内存中最大的一块区域,也是垃圾回收的主要区域。
- 栈:存放局部变量、方法调用等信息,每个线程都有自己独立的栈空间。
- 方法区:存放类信息、常量、静态变量等,被所有线程共享。
- Spring框架中IoC和AOP:
- IoC(控制反转):把对象的创建和依赖注入交给Spring容器来管理,降低了对象之间的耦合度。
- AOP(面向切面编程):能在不修改原有代码的基础上,动态地将一些功能切入到方法执行前后等位置,比如日志记录、事务管理等。
- Spring Boot自动配置原理:通过@EnableAutoConfiguration注解开启自动配置,它会根据类路径下的依赖来自动配置相关的Bean。Spring Boot会扫描classpath下所有的jar包和配置类,根据这些依赖信息来自动配置合适的组件。
- MyBatis动态SQL:
- if:根据条件判断动态拼接SQL语句。
- where:智能处理SQL语句中的where子句,避免多余的and。
- trim:可以灵活地添加或删除前缀、后缀等。
- choose、when、otherwise:类似于Java中的switch语句,根据条件选择执行相应的when子句。
- foreach:用于循环遍历集合,动态生成SQL语句中的in条件等。
- Dubbo集群容错策略:
- failover:失败自动切换,当调用失败后会自动重试其他服务器。
- failfast:快速失败,一旦调用失败立即报错。
- failsafe:失败安全,调用失败后不抛出异常,直接忽略。
- failback:失败后自动恢复,失败后会定时重试。
- forking:并行调用多个服务器,只要有一个成功就返回。
- broadcast:广播调用所有服务器,逐个调用,任意一个报错则报错。
- RabbitMq消息确认机制:
- 生产者确认:
- 事务机制:通过channel.txSelect开启事务,通过channel.txCommit提交事务,通过channel.txRollback回滚事务。
- 发送方确认:通过channel.confirmSelect开启发送方确认,消息发送后通过addConfirmListener监听确认结果。
- 消费者确认:
- 自动确认:消费者接收到消息后自动确认,消息会被立即从队列中移除。
- 手动确认:消费者接收到消息后,需要手动调用channel.basicAck方法进行确认,可批量确认等。
- 生产者确认:
- xxl-job执行器类型:
- 单机执行器:适用于单机部署的场景。
- 集群执行器:用于集群部署,支持任务分片、负载均衡等功能。