面试 Java 框架八股文五问五答第三期
面试 Java 框架八股文五问五答第三期
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!
⭐点赞⭐收藏⭐不迷路!⭐
1)什么是线程池?
线程池是一种管理和复用线程的机制。它通过预先创建一组线程,并使用这些线程来执行任务,从而避免了频繁创建和销毁线程的开销,提高了系统的性能和资源利用率。
2)怎么使用线程池?
- 创建线程池对象,指定线程池的大小和其他参数。
- 提交任务给线程池,可以是Runnable或Callable对象。
- 线程池会自动从线程池中获取空闲的线程来执行任务。
- 当任务执行完成后,线程会返回线程池,可以继续执行其他任务。
3)线程池有哪些参数?
- 核心线程数(corePoolSize):线程池中保持的最小线程数。
- 最大线程数(maximumPoolSize):线程池中允许的最大线程数。
- 空闲线程存活时间(keepAliveTime):当线程池中的线程数量超过核心线程数时,多余的空闲线程的存活时间。
- 任务队列(workQueue):用于存放待执行的任务的队列。
- 线程工厂(threadFactory):用于创建新线程的工厂。
4)线程池底层工作原理
- 当有任务提交给线程池时,线程池会首先尝试使用空闲线程来执行任务。
- 如果空闲线程数量不足,且当前线程数小于最大线程数,线程池会创建新的线程来执行任务。
- 如果当前线程数已达到最大线程数,并且任务队列已满,线程池会根据设定的拒绝策略来处理任务。
- 当线程池中的线程空闲一段时间后(根据keepAliveTime设定),多余的线程会被销毁,以保持线程池中的线程数量在核心线程数范围内。
5)常见的线程安全并发容器有哪些?
- ConcurrentHashMap:线程安全的哈希表。
- CopyOnWriteArrayList:线程安全的动态数组。
- BlockingQueue:线程安全的阻塞队列。
- ConcurrentLinkedQueue:线程安全的链表队列。
- ConcurrentSkipListSet:线程安全的有序集合。
import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) throws Exception {// 创建线程池对象,大小为10ExecutorService executor = Executors.newFixedThreadPool(10);// 创建线程安全的哈希表ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();// 提交10个任务给线程池for (int i = 1; i <= 10; i++) {final int taskNum = i;executor.submit(new Runnable() {public void run() {// 线程安全的putIfAbsent方法map.putIfAbsent("key" + taskNum, taskNum);System.out.println("Task " + taskNum + " is running.");}});}// 关闭线程池executor.shutdown();executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);// 输出哈希表中的内容System.out.println(map);}
}