Skip to content

用友科技 已完结

日期

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 的理解

提示

面向对象、跨平台

  1. Java 是面向对象的语言,具有"封装、继承、多态、抽象"四大特性。
  2. Java 可以跨平台运行,编译后的字节码文件运行在 JVM 虚拟机中。

如何创建多个线程

  1. 继承 Thread 类,重写 run() 方法
  2. 实现 Runnable 接口,重写 run() 方法
  3. 实现 Callable 接口,重写 call() 方法

线程池常用的哪些参数是什么?

提示

核心线程数、最大线程数、存活时间、任务队列、拒绝策略

  1. corePoolSize:核心线程数,空闲也不会回收的线程。
  2. maximumPoolSize:最大线程数。
  3. keepAliveTime:超过核心线程数的线程,空闲的最大存活时间。
  4. workQueue:任务队列类型。
    • ArrayBlockingQueue:有界阻塞队列,基于数组结构,适合限制任务数
    • LinkedBlockingQueue:无界阻塞队列,基于链表结构,适合处理短时间内的高并发任务
  5. handler:无法添加到队列的处理方法。
    • AbortPolicy:抛出 RejectedExecutionException 异常。
    • CallerRunsPolicy:调用者线程运行任务。
    • DiscardPolicy:丢弃任务,不抛出异常。
    • DiscardOldestPolicy:丢弃队列中最旧的任务,并尝试提交当前任务。

线程池参数配置的原则有什么?

  1. 根据线程的类型配置核心线程数
    1. 对于CPU密集型任务,核心线程数通常可以设置为 CPU核心数 + 1
    2. 对于IO密集型任务,核心线程数可以设置为 CPU核心数 * 2 或更多。
  2. 根据业务需求选择合适的拒绝策略,确保任务不会被无故丢弃或造成系统崩溃。
  3. 选择合适的任务队列类型,通常无界队列适合处理短时间内的高并发任务,而有界队列则适合限制任务数,防止资源耗尽。

静态数组是定长的,为什么 ArrayList 可以无限添加?

ArrayList 底层有扩容机制,当容量不够时,会扩容到原来的 1.5 倍。

Spring Boot 解决了什么问题?

  1. 简化了 Spring 繁琐的配置
  2. 内置了 Tomcat 服务器

Spring 创建 Bean 的几种方式

  1. 使用 @Component、@Service、@Controller、@Repository 注解将类声明为 Bean
  2. 在标有 @Configuration 的配置类中,使用 @Bean 注解,将方法的返回值声明为 Bean
  3. 使用 FactoryBean 创建 Bean

Released under the MIT License.