面试 Java 框架八股文五问五答第三期

发布时间:2023年12月29日

面试 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 {
        // 创建线程池对象,大小为10
        ExecutorService 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);
    }
}
文章来源:https://blog.csdn.net/qq_67358181/article/details/135287420
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。