线程池的参数详细介绍 - Java

线程池(Thread Pool)是为了解决频繁创建和销毁线程所带来的性能问题而提出的一种线程管理机制。使用线程池可以重复利用已创建的线程,减少线程创建和销毁的开销,并且能有效控制系统中线程的数量,防止线程过多导致资源耗尽。

线程池在 Java 中是通过 ThreadPoolExecutor 实现的,下面我将详细介绍 ThreadPoolExecutor 的各个参数,并给出具体的示例。

ThreadPoolExecutor 构造函数

ThreadPoolExecutor 的构造函数如下:

java

ThreadPoolExecutor(int corePoolSize,
                   int maximumPoolSize,
                   long keepAliveTime,
                   TimeUnit unit,
                   BlockingQueue<Runnable> workQueue,
                   ThreadFactory threadFactory,
                   RejectedExecutionHandler handler)

各个参数的详细介绍与示例:

1. corePoolSize(核心池大小)

  • 类型int
  • 说明:线程池中始终保留的线程数,线程池中的线程数不会少于 corePoolSize,即使这些线程处于空闲状态。核心线程即使没有任务执行,也会被保持。
  • 常见应用场景:如果任务执行频繁,且负载较高,可以设置较大的核心线程数,以减少线程的创建和销毁成本。

示例

java

int corePoolSize = 4;

此示例表示线程池中的核心线程数为 4,即线程池至少会有 4 个线程在空闲时保持活跃。

2. maximumPoolSize(最大池大小)

  • 类型int
  • 说明:线程池中允许的最大线程数。当线程池中已有 corePoolSize 个线程且任务队列已满时,如果新任务提交,线程池会创建新的线程,直到线程池中的线程数达到 maximumPoolSize
  • 常见应用场景:可以根据系统资源配置该值,通常在任务量很大且负载较高时,设置较大的 maximumPoolSize

示例

java

int maximumPoolSize = 10;

此示例表示线程池中最多可以有 10 个线程。

3. keepAliveTime(空闲线程存活时间)

  • 类型long
  • 说明:当线程池中的线程数超过 corePoolSize 时,多余的线程将在空闲 keepAliveTime 时间后被销毁。如果 allowCoreThreadTimeOuttrue,则核心线程也会被超时销毁。
  • 常见应用场景:适用于长时间没有任务的情况下,线程池会销毁空闲线程,节省资源。

示例

java

long keepAliveTime = 60; // 60秒

此示例表示线程池中超过 corePoolSize 的线程在空闲 60 秒后将被销毁。

4. unit(时间单位)

  • 类型TimeUnit
  • 说明keepAliveTime 的时间单位,可以是 TimeUnit.SECONDSTimeUnit.MILLISECONDSTimeUnit.MINUTES 等。
  • 常见应用场景:根据 keepAliveTime 的值选择适合的时间单位。

示例

java

TimeUnit unit = TimeUnit.SECONDS;

此示例表示 keepAliveTime 使用秒为单位。

5. workQueue(任务队列)

  • 类型BlockingQueue<Runnable>
  • 说明:用于存放等待执行的任务。常见的实现有:LinkedBlockingQueue:无界队列,大小为 Integer.MAX_VALUE,适用于任务量无法预测的场景。ArrayBlockingQueue:有界队列,适用于任务量可以预估的场景。SynchronousQueue:没有容量的队列,每个提交的任务都必须等待一个线程来处理,适用于需要处理每个任务的特殊场景。

示例

java

BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);

此示例表示线程池的任务队列大小为 100,当队列满时,新的任务会被拒绝。

6. ThreadFactory

  • 类型ThreadFactory
  • 说明:线程池用来创建新线程的工厂。通过自定义 ThreadFactory,你可以设置线程的名字、优先级等属性。默认的 ThreadFactory 会创建普通的线程。
  • 常见应用场景:如果你需要给线程命名或设置特定的线程属性,可以自定义 ThreadFactory

示例

java

ThreadFactory threadFactory = new ThreadFactory() {
    private int count = 0;
    public Thread newThread(Runnable r) {
        return new Thread(r, "Custom-Thread-" + count++);
    }
};

此示例自定义了线程工厂,每个线程的名字都会被设置为 Custom-Thread-0Custom-Thread-1 等。

7. RejectedExecutionHandler

  • 类型RejectedExecutionHandler
  • 说明:当线程池无法处理新任务时,执行的策略。常见的拒绝策略有:AbortPolicy:默认策略,抛出 RejectedExecutionException。CallerRunsPolicy:由提交任务的线程执行该任务。DiscardPolicy:丢弃任务。DiscardOldestPolicy:丢弃队列中最旧的任务。

示例

java

RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();

此示例使用 CallerRunsPolicy 策略,如果线程池无法处理新任务,任务将由提交任务的线程来执行。

完整示例

java

import java.util.concurrent.*;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            4,  // corePoolSize
            10, // maximumPoolSize
            60, // keepAliveTime
            TimeUnit.SECONDS, // unit
            new LinkedBlockingQueue<>(100), // workQueue
            new ThreadFactory() {
                private int count = 0;
                @Override
                public Thread newThread(Runnable r) {
                    return new Thread(r, "Custom-Thread-" + count++);
                }
            },
            new ThreadPoolExecutor.CallerRunsPolicy() // RejectedExecutionHandler
        );

        // 提交任务到线程池
        for (int i = 0; i < 200; i++) {
            executor.submit(() -> {
                System.out.println(Thread.currentThread().getName() + " is executing the task.");
                try {
                    Thread.sleep(1000); // 模拟任务执行
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

        // 关闭线程池
        executor.shutdown();
    }
}

解释:

  • corePoolSize 为 4,表示线程池有 4 个核心线程。
  • maximumPoolSize 为 10,最多允许 10 个线程。
  • keepAliveTime 为 60 秒,超过 4 个线程后的线程将在空闲 60 秒后被销毁。
  • workQueue 使用一个 LinkedBlockingQueue,最大容量为 100。当任务超过 100 个时,新的任务会被拒绝。
  • ThreadFactory 自定义了线程的名字为 Custom-Thread-0Custom-Thread-1 等。
  • RejectedExecutionHandler 设置为 CallerRunsPolicy,当线程池不能处理任务时,任务会由提交任务的线程来执行。

线程池工作流程

  1. 任务提交:当任务提交给线程池时,线程池会先检查是否有空闲线程。如果没有,且线程池中的线程数小于 corePoolSize,会创建新的线程执行任务。
  2. 任务排队:当线程池中的线程数已经达到 corePoolSize,但还没有达到 maximumPoolSize 时,新的任务会被放入 workQueue 队列中。
  3. 线程扩展:如果任务队列已满,且线程池中的线程数小于 maximumPoolSize,线程池会创建新的线程来处理任务。
  4. 任务拒绝:如果线程池中的线程数已达到 maximumPoolSize 且任务队列也已满,任务将根据 RejectedExecutionHandler 策略来处理。

通过合理的配置线程池参数,可以确保系统在高并发场景下平稳运行,避免线程过多导致的资源浪费或线程过少导致的任务阻塞。

Java碎碎念 文章被收录于专栏

来一杯咖啡,聊聊Java的碎碎念呀

全部评论

相关推荐

05-15 18:12
门头沟学院 Java
全程1h,结合实习、项目,穿插着八股进行提问,无自我介绍,无手撕1.&nbsp;我看你实习时间挺久的,实习主要做的工作?医疗平台的功能?服务量级?2.&nbsp;实习过程中遇到有挑战的事?相关背景,问题和解决方法?3.&nbsp;系统集群的规模和相关节点的配置?4.&nbsp;多租户架构,为什么采用了基于DataBase/Schema级别的隔离?如何通过租户标识进行DataBase路由?5.&nbsp;考虑一个场景,存在大租户对于系统来说影响很大,甚至不可接受,如何进行解决?(回答租户分级,大租户独立节点)6.&nbsp;&nbsp;k8s中使用nginx-ingress-controller和直接使用nginx的区别?使用Ingress集成nginx和使用普通的容器集成有什么区别7.&nbsp;Deployment和Pod的区别?Pod和Container的区别?既然建议一个Pod封装一个Contanier为什么要封装Pod而不是直接使用Container?(回答可能有主Container和从Container)什么场景下会使用?(不会)8.&nbsp;java与python的异同?如果用SpringBoot,怎么实现多租户架构?9.&nbsp;如果需要扩展租户物理节点,如何做到修改配置不重启服务?(回答配置中心)10.&nbsp;数据库采用主从架构,如果主从之间网络忽然连接不上,导致数据不同步,如何解决?(回答暂时解除主从关系)&nbsp;暂时解除主从关系,如何实现?(回答采用Mycat,修改XML配置文件)追问如果不通过中间件如何解决?(回答配置中心?)追问Nacos配置中心修改配置可以立即生效吗?如何做到的?11.&nbsp;医疗平台对隐私安全比较注重,体现在哪些方面?12.&nbsp;&nbsp;https如何保证安全?如何确保TLS握手的对象是对的?如何确保CA机构是权威的?有没有可能伪造CA机构?(想了想不知道如何防伪)13.&nbsp;如果没有nginx或是ingress,会有什么问题?nginx或是ingress是如何实现负载均衡的?以及它们如何能够转发到对应IP的?14.&nbsp;微服务的注册中心原理?如何动态的进行服务发现?微服务的注册中心节点一般也是集群,如何确保集群内部的各个节点都有完整的信息?(回答可能是定期通讯)如果请求落到的节点没有完整的信息怎么办?(回答可能是请求其他节点,不会)15.&nbsp;实验室项目开发过程中,是如何进行沟通的?如何确保项目整体的推进?16.&nbsp;项目用到线程池,如果执行任务过程中,节点宕机了,恢复后如何可以继续执行?(回答持久化)如果持久化过程中宕机的,导致没有落库成功呢?(不会)17.&nbsp;线程池使用什么方法创建的,为什么不用Executors创建?18.&nbsp;项目中用到SPI机制,具体是怎么用的?(回答作为框架功能扩充者,以扩充ShardingJDBC框架)19.&nbsp;分表ID怎么生成的?为什么使用UUID?UUID和自增ID的区别?20.&nbsp;有调优过JVM参数吗?(回答自己玩过,线上只修改过垃圾回收器)CMS和G1的异同?为什么G1可以设置停顿时间?如何评估Region的价值?(忘了)21.&nbsp;Redis和MemCache区别?什么场景使用MemCache?22.&nbsp;RabbitMQ,RocketMQ,Kafka的差异?Kafka为什么这么快了解过吗?(回答只知道零拷贝)聊天:中国海洋大学在海南吗?(在青岛,回答做导师项目来三亚的)有没有感兴趣的方向?有没有想要发展的地方?(回答广州)有没有找到其他的实习?(回答没有,没人要🐀🐀)反问:部门业务(游戏平台,游戏账号买卖,游戏包分发,游戏加速工具)
点赞 评论 收藏
分享
Q1.&nbsp;Lamda表达式A1:&nbsp;Lamda表达式更简洁,创建匿名函数。简化函数式接口。只有一个表达式时,表达式的结果直接作为返回值;多个表达式,需要大括号,return语句作为返回值。lamda表达式使JAVA支持函数式编程,允许函数作为参数传递;结合Stream&nbsp;API处理集合操作如过滤。Q2.&nbsp;为什么有包装类&nbsp;Integer和int的区别A2.&nbsp;集合,泛型只能使用引用类型,不能使用基本数据类型。集合需要支持动态内存分配、垃圾回收等特性,而这些机制都依赖于对象。int是基本数据类型,Integer是int的封装类,是引用类型。int默认值是0,而Integer默认值是null,所以Integer能区分出0和null的情况。基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间,必须通过实例化开辟数据空间之后才可以赋值。我自己想的是&nbsp;集合如Set需要hashCode和equals方法来判断元素是否已经存在,所以集合必须用封装类Q3:&nbsp;项目架构&nbsp;选型&nbsp;原因Q4:&nbsp;微服务间调用方式、通信协议,为何这样选Dubbo&nbsp;是阿里巴巴开源的高性能&nbsp;Java&nbsp;RPC&nbsp;框架,广泛应用于微服务架构中,其核心优势在于高效的远程调用能力、丰富的服务治理机制以及灵活的多协议支持。以下是关于&nbsp;Dubbo&nbsp;的微服务调用方式、支持的通信协议及选择&nbsp;Dubbo&nbsp;的原因的详细解析:---###&nbsp;**一、Dubbo&nbsp;的微服务调用方式**Dubbo&nbsp;的微服务间调用主要基于&nbsp;**RPC(远程过程调用)**&nbsp;实现,通过以下核心机制完成服务交互:1.&nbsp;**服务注册与发现**-&nbsp;服务提供者启动时,将自身信息(如服务名、地址、端口)注册到注册中心(如&nbsp;Zookeeper、Nacos),消费者通过注册中心动态获取可用服务列表。-&nbsp;支持多种负载均衡策略(随机、轮询、最少活跃调用等),自动选择最优服务实例进行调用。2.&nbsp;**RPC&nbsp;调用流程**-&nbsp;**接口定义与共享**:服务提供者和消费者需共享相同的服务接口定义(如&nbsp;Java&nbsp;Interface),通过代理机制屏蔽底层通信细节。-&nbsp;**序列化与传输**:调用参数和返回结果通过序列化(如&nbsp;Hessian、Protobuf)转换为二进制数据,通过&nbsp;TCP&nbsp;或&nbsp;HTTP&nbsp;协议传输。3.&nbsp;**服务治理机制**-&nbsp;**容错策略**:提供&nbsp;6&nbsp;种容错模式(如失败自动切换、快速失败、广播调用),应对不同场景的异常处理需求。-&nbsp;**动态配置**:通过配置中心(如&nbsp;Nacos)实现参数动态更新,无需重启服务。---###&nbsp;**二、Dubbo&nbsp;支持的通信协议**Dubbo&nbsp;支持多种通信协议,开发者可根据场景灵活选择:|&nbsp;**协议**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;**特点**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;**适用场景**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||----------------|--------------------------------------------------------------------------|-----------------------------------------------------------------------------||&nbsp;**Dubbo&nbsp;协议**&nbsp;|&nbsp;默认协议,基于&nbsp;TCP&nbsp;长连接与二进制传输,性能高、延迟低,但跨语言支持有限。&nbsp;|&nbsp;高并发、低延迟的&nbsp;Java&nbsp;微服务间调用。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;**Triple&nbsp;协议**&nbsp;|&nbsp;基于&nbsp;HTTP/2&nbsp;和&nbsp;Protobuf,兼容&nbsp;gRPC,支持流式通信和&nbsp;TLS&nbsp;加密,穿透性强。&nbsp;|&nbsp;云原生环境、跨语言调用(如与&nbsp;Go/Python&nbsp;交互)或需要网关代理的场景。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;**HTTP/REST**&nbsp;&nbsp;|&nbsp;基于&nbsp;HTTP&nbsp;的&nbsp;RESTful&nbsp;风格,兼容性强,但性能较低。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;跨语言&nbsp;Web&nbsp;服务集成或对外提供开放&nbsp;API。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;**gRPC**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;基于&nbsp;HTTP/2&nbsp;的高效协议,支持双向流式通信,需依赖&nbsp;Protobuf&nbsp;定义服务。&nbsp;|&nbsp;需要强类型约束、跨语言且对性能要求较高的场景。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;**Hessian**&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;二进制协议,跨语言支持较好,但性能略逊于&nbsp;Dubbo&nbsp;协议。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;Java&nbsp;与非&nbsp;Java&nbsp;系统(如&nbsp;PHP)间的轻量级集成。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|---###&nbsp;**三、选择&nbsp;Dubbo&nbsp;的核心原因**1.&nbsp;**高性能与低延迟**-&nbsp;Dubbo&nbsp;协议采用单一长连接和异步非阻塞通信(基于&nbsp;Netty),在高并发场景下性能显著优于&nbsp;HTTP/REST,例如在阿里巴巴双十一中支持万亿级调用。-&nbsp;序列化优化(如&nbsp;Dubbo3&nbsp;的&nbsp;Triple&nbsp;协议性能较&nbsp;gRPC&nbsp;提升&nbsp;40%)。2.&nbsp;**完善的服务治理**-&nbsp;**负载均衡**:支持随机、轮询、一致性哈希等策略,自适应算法可动态感知服务端负载。-&nbsp;**容错与熔断**:内置多种容错模式(如&nbsp;Failover、Failfast),支持服务降级和熔断机制,保障系统稳定性。-&nbsp;**动态扩展**:服务实例可动态注册/注销,支持水平扩展与灰度发布。3.&nbsp;**多协议与生态兼容性**-&nbsp;支持&nbsp;Dubbo、Triple、gRPC&nbsp;等多种协议,可无缝集成&nbsp;Spring&nbsp;Cloud、Kubernetes&nbsp;等生态。-&nbsp;提供统一的服务治理能力(如监控、链路追踪),适用于混合技术栈环境。4.&nbsp;**生产级可靠性验证**-&nbsp;历经阿里巴巴大规模电商场景验证,支持百万级节点集群和智能流量调度,具备高可用性。---###&nbsp;**四、总结**Dubbo&nbsp;通过高效的&nbsp;RPC&nbsp;调用机制、灵活的多协议支持以及强大的服务治理能力,成为构建高性能微服务系统的首选框架。其优势尤其体现在&nbsp;**高并发场景下的性能表现**、**跨语言与云原生适配能力**&nbsp;以及&nbsp;**企业级服务治理功能**。若需进一步优化性能或扩展功能,可结合具体场景选择&nbsp;Triple、gRPC&nbsp;等协议,或通过第三方工具(如&nbsp;Prometheus、Zipkin)增强监控能力。
查看4道真题和解析
点赞 评论 收藏
分享
05-16 13:15
已编辑
门头沟学院 Java
timeline:4.22&nbsp;投递简历无笔试4.28&nbsp;早一面&nbsp;晚二面4.28-5.8&nbsp;官网状态一直处于业务复试5.9&nbsp;成功变为筛选中5.10&nbsp;发邮箱问流程&nbsp;回复需要业务加面5.12&nbsp;收到约面邮箱&nbsp;但是写的时间20分钟&nbsp;以为要被三面kpi掉了5.15&nbsp;晚进直播间&nbsp;到点后15分钟面试官没来(差点要退出了)&nbsp;结果一问是hr面5.16&nbsp;oc一面面经(30min):自我介绍1.&nbsp;concurrenthashmap底层实现2.&nbsp;CAS和AQS对concurrentHashmap有什么改进3.&nbsp;AQS4.&nbsp;锁分类&nbsp;乐观锁&nbsp;悲观锁5.&nbsp;reentrantlock&nbsp;对于AQS做了什么升级6.&nbsp;线程池&nbsp;核心参数&nbsp;流程7.&nbsp;线程进程8.&nbsp;线程是越多越好吗&nbsp;CPU处理线程什么9.&nbsp;虚拟内存10.&nbsp;TCP三握&nbsp;四挥11.&nbsp;为什么三握&nbsp;四挥12.&nbsp;IO多路复用&nbsp;详细13.&nbsp;事务隔离级别具体怎么实现14.&nbsp;索引为什么选b+15.&nbsp;b+是平衡树吗16.&nbsp;手撕最小子序和二面面经(1h):自我介绍1.&nbsp;手撕环形缓存队列2.&nbsp;实习拷打3.&nbsp;线程池调优方法&nbsp;为什么io密集型需要将核心线程数设置为cpu核心数二倍(蒙了)4.&nbsp;如何实现微服务注册中心&nbsp;详细(傻了)5.&nbsp;接口反应慢怎么排查和解决6.&nbsp;英雄打怪兽&nbsp;怎么设计场景(彻底绷不住了)hr面(10min)总结:一面基本全八股&nbsp;都回答上了&nbsp;二面纯压力面&nbsp;但是面试官很耐心&nbsp;在我回答不上来后&nbsp;能给我解释感谢云智能够捞我🙏
查看23道真题和解析
点赞 评论 收藏
分享
1、讲一下设备更新的整体逻辑是怎么做的2、为什么使用CompletableFuture,与Future区别是什么3、线程池核心参数4、线程提交任务一共有哪些方式,线程池的工作原理5、为什么使用Reddision分布式锁6、缓冲队列+批量提交是怎么做的7、TP99的概念是什么8、250次合并30次一次为8个设备提交,是这样吗9、场景题:深分页问题+分页问题原生sql语句,亿万级别的数据考虑到分页的要求,sql怎么写10、热点数据Redis具体怎么做的,如何保证数据一致性11、覆盖索引12、数据的事务隔离级别13、场景题:如果同时插入30条范围更新的数据,这30条更新的数据之间有交叉,会发生什么14、索引为什么不用Redis的跳表而是用B+树15、讲了实习中覆盖索引+延迟加载是怎么做的16、使用MQ的原因,以及如何保证数据一致性17、如何保障生产者的高可用性,万一生产者down了怎么办18、布隆过滤器原理19、问了java技术栈最擅长的是什么(java)20、AOP是如何实现的,目的是什么21、&nbsp;动态代理有哪几种方式22、AOP最常见的使用场景是什么23、你最常使用哪些注解24、场景题,多个设备更新的需求同时打过来,如何保证处理消息队列的顺序与时间上的顺序一致25、热点数据是怎么存储的26、Springbean的生命周期27、Mybatis是如何通过注解生成相应的sql语句的(工作原理补几个进程间通信方式间隙锁是什么库存超卖场景能保证唯一性的&nbsp;UUID&nbsp;能否作为数据库主键手撕没做出来应该凉了
小博真爱学习:兄嘚你手斯是什么?给了20分钟,让写一个多线程的优先级任务调度,我也没斯出来
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务