线程池(原理 + 应用)
一、什么是线程池线程池Thread Pool本质上就是提前创建好一批线程重复使用避免频繁创建和销毁线程的开销简单理解不用线程池来一个任务 → 创建线程 → 执行 → 销毁 ❌开销大使用线程池来一个任务 → 放入池中 → 线程复用执行 ✅高效二、为什么要使用线程池1. 降低资源消耗线程创建/销毁是重量级操作涉及系统调用2. 提高响应速度线程已存在 → 任务直接执行3. 提高线程可管理性可以控制最大线程数队列长度拒绝策略三、线程池核心类Java中线程池核心接口ExecutorService常用创建方式⚠️ 面试重点Executors.newFixedThreadPool(10); // 固定线程数 Executors.newCachedThreadPool(); // 可缓存线程池 Executors.newSingleThreadExecutor(); // 单线程 Executors.newScheduledThreadPool(5); // 定时线程池但实际开发中不推荐使用 Executors原因可能导致 OOM无界队列 / 无限线程四、线程池底层原理重点线程池核心类ThreadPoolExecutor构造函数public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲存活时间 TimeUnit unit, BlockingQueueRunnable workQueue, // 任务队列 ThreadFactory threadFactory, RejectedExecutionHandler handler // 拒绝策略 )五、线程池执行流程面试高频任务提交后执行逻辑1. 如果线程数 corePoolSize → 直接创建线程执行 2. 否则 → 进入任务队列 3. 如果队列满了 且 线程数 maximumPoolSize → 创建新线程 4. 如果队列满了 且 达到最大线程数 → 执行拒绝策略 一句话总结先核心 → 再队列 → 再最大 → 再拒绝六、四种拒绝策略必考策略说明AbortPolicy默认直接抛异常CallerRunsPolicy调用线程自己执行DiscardPolicy直接丢弃任务DiscardOldestPolicy丢弃最老任务示例new ThreadPoolExecutor( 5, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(100), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() );七、常见线程池类型对比1. FixedThreadPoolExecutors.newFixedThreadPool(10);特点线程数固定队列无界 ❗风险2. CachedThreadPoolExecutors.newCachedThreadPool();特点线程数无限容易 OOM ❗3. SingleThreadExecutorExecutors.newSingleThreadExecutor();特点单线程串行执行保证顺序4. ScheduledThreadPoolExecutors.newScheduledThreadPool(5);特点支持定时任务八、正确使用线程池企业级写法 推荐手动创建ExecutorService executor new ThreadPoolExecutor( 5, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(100), new ThreadFactory() { Override public Thread newThread(Runnable r) { return new Thread(r, custom-thread); } }, new ThreadPoolExecutor.CallerRunsPolicy() );九、线程池状态进阶线程池有5种状态状态说明RUNNING接收任务并执行SHUTDOWN不接收新任务执行已有STOP中断所有任务TIDYING清理中TERMINATED完全结束十、线程池关闭方式executor.shutdown(); // 优雅关闭 executor.shutdownNow(); // 强制关闭区别shutdown执行完已有任务shutdownNow直接中断十一、实际开发最佳实践面试加分1. 不使用 Executors 防止 OOM2. 合理配置线程数 CPU密集型线程数 CPU核数 1 IO密集型线程数 CPU核数 * 23. 队列要有界new ArrayBlockingQueue(100)4. 自定义线程名称方便排查问题new Thread(r, order-thread-1)十三、总结面试版 线程池核心价值复用线程控制并发提高性能 核心参数corePoolSizemaximumPoolSizeworkQueuehandler 执行流程核心线程 → 队列 → 最大线程 → 拒绝策略
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2437953.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!