主题
用友科技 已完结
日期
2024 年 5 月 22 日
自我介绍
先简单介绍一下
我是软件工程专业的 wmh,在校期间参加了学校的项目组,一直在项目组中学习,也参与过几个学校与企业合作的一些项目,比如为公司的低代码平台开发过组件库,给学校做过实验室的预约系统和给学校的申硕的平台做了二次开发。
个人的技术栈主要是 Spring Boot、MySQL、Redis,也学习过部分前端知识,会使用 Vue 框架。有一定的运维能力,在项目组中也做过运维工作。在校期间参加了一些算法相关的竞赛,获得了蓝桥杯的省一和 CCPC 省赛的铜奖。
OJ 项目
简单的讲一下这个在线代码判题平台
在系统前台,管理员可以创建、管理题目;用户可以搜索题目、阅读题目、编写并提交代码。
在系统后端,能够根据管理员设定的题目测试用例,在代码沙箱中对代码进行编译运行并判断输出是否正确。
Docker 是怎么使用的?
使用 Docker 作为代码沙箱去执行代码。创建一个 Docker 容器,在容器里执行用户提交的代码,然后进行判题的啊。这样的话,如果说有一些恶意代码,可以用来保证那个服务器的安全。
其他中间件是如何使用到的?
MySQL 主要是用于存放题目信息和提交记录、用户记录。
Redis 主要是用于做那个分布式登录,就是现在去保存了 token 和用户信息,登录之后会得到 token。
Rabbit MQ 主要是做异步判题。判题逻辑是会消耗较长的时间,所以使用了异步化判题。提交后返回提交成功,使用消息队列进行异步判题。
直接给后台运行不行吗?为什么使用消息队列?
我认为是可以的,也可以使用线程池 + 提交队列的方式。
相对使用线程池来说,Rabbit MQ 可以有更多可扩展性,可以部署多个判题沙箱,实现负载均衡。并且 Rabbit MQ 具有持久化机制和可视化监控。
Java 八股
说一下你对 Java 的理解
提示
面向对象、跨平台
- Java 是面向对象的语言,具有"封装、继承、多态、抽象"四大特性。
- Java 可以跨平台运行,编译后的字节码文件运行在 JVM 虚拟机中。
如何创建多个线程
- 继承 Thread 类,重写 run() 方法
- 实现 Runnable 接口,重写 run() 方法
- 实现 Callable 接口,重写 call() 方法
线程池常用的哪些参数是什么?
提示
核心线程数、最大线程数、存活时间、任务队列、拒绝策略
- corePoolSize:核心线程数,空闲也不会回收的线程。
- maximumPoolSize:最大线程数。
- keepAliveTime:超过核心线程数的线程,空闲的最大存活时间。
- workQueue:任务队列类型。
- ArrayBlockingQueue:有界阻塞队列,基于数组结构,适合限制任务数
- LinkedBlockingQueue:无界阻塞队列,基于链表结构,适合处理短时间内的高并发任务
- handler:无法添加到队列的处理方法。
- AbortPolicy:抛出 RejectedExecutionException 异常。
- CallerRunsPolicy:调用者线程运行任务。
- DiscardPolicy:丢弃任务,不抛出异常。
- DiscardOldestPolicy:丢弃队列中最旧的任务,并尝试提交当前任务。
线程池参数配置的原则有什么?
- 根据线程的类型配置核心线程数
- 对于CPU密集型任务,核心线程数通常可以设置为 CPU核心数 + 1。
- 对于IO密集型任务,核心线程数可以设置为 CPU核心数 * 2 或更多。
- 根据业务需求选择合适的拒绝策略,确保任务不会被无故丢弃或造成系统崩溃。
- 选择合适的任务队列类型,通常无界队列适合处理短时间内的高并发任务,而有界队列则适合限制任务数,防止资源耗尽。
静态数组是定长的,为什么 ArrayList 可以无限添加?
ArrayList 底层有扩容机制,当容量不够时,会扩容到原来的 1.5 倍。
Spring Boot 解决了什么问题?
- 简化了 Spring 繁琐的配置
- 内置了 Tomcat 服务器
Spring 创建 Bean 的几种方式
- 使用 @Component、@Service、@Controller、@Repository 注解将类声明为 Bean
- 在标有 @Configuration 的配置类中,使用 @Bean 注解,将方法的返回值声明为 Bean
- 使用 FactoryBean 创建 Bean