为什么要有线程池?
- 资源管理:在多线程中,每个线程都需要占用 CPU 资源和内存。如果不加以限制地创建线程,会导致系统资源耗尽,引发系统崩溃。而线程池可以限制并控制线程的数量,从而避免此问题。
- 提高性能:线程池可以复用线程,减少线程创建和销毁的开销。
- 任务排队:线程池通过任务队列和工作线程结合,合理分配线程任务。保证任务按照一定的顺序执行。避免线程竞争和冲突。
- 统一管理:线程池提供了统一的线程管理方式。可以对线程进行监控、调度和管理。
说一说线程池有哪些常用参数?
- corePoolSize:线程池中的核心线程数量。
- maximumPoolSize:线程池中的最大线程数量。
- keepAliveTime:非核心线程的空闲时间超过 keepAliveTime 后会被回收。
- timeUnit:表示 keepAliveTime 的时间单位,如秒、分钟。
- workQueue:线程池内部的阻塞队列。用于存放待执行的任务。
- threadFactory:线程池创建线程的工厂方法。通常用于命名线程,以便排查问题。
- RejectionExecutionHandle:拒绝策略。当线程池的任务超出最大线程数量时,会执行的策略。
BIO、NIO、AIO 的区别?
- BIO:阻塞式的 I/O 模型。一个线程执行 I/O 请求后。如果数据还没准备好。线程会陷入阻塞状态。BIO 适合并发连接数少、比较固定的场景。
- NIO:非阻塞式的 I/O 模型。NIO 使用缓冲区和通道来处理数据。提高了 I/O 的效率。适合并发连接数多的场景。
- AIO:异步的 I/O 模型。线程执行 I/O 请求后,可以继续去执行其他任务。当数据准备完毕后,由操作系统通知线程。AIO 适合并发连接数多,希望避免 I/O 操作阻塞线程的场景。
BIO 是阻塞 I/O,一个连接一个线程,适合连接数少的场景;
NIO 采用多路复用,一个线程可以处理多个连接,适合高并发,Netty 基于此实现;
AIO 是真正的异步 I/O,操作系统完成后通知应用线程,性能最好,但实际生产应用较少。

被折叠的 条评论
为什么被折叠?



