ppt做书模板下载网站有哪些内容,免费的微商城平台,网站优化软件下载,淘宝小网站怎么做的文章目录 你的Java项目还在等待吗#xff1f;快来学会线程池#xff0c;解放你的性能#xff01;1 什么是线程池#xff1f;为什么需要它#xff1f;2 线程池的参数有哪些#xff1f;3 不同类型的线程池有哪些配置#xff1f; 你的Java项目还在等待吗#xff1f;快来学… 文章目录 你的Java项目还在等待吗快来学会线程池解放你的性能1 什么是线程池为什么需要它2 线程池的参数有哪些3 不同类型的线程池有哪些配置 你的Java项目还在等待吗快来学会线程池解放你的性能 近期迷上了举例子来结合知识点学习尽量减少枯燥如有错见谅哈~ 1 什么是线程池为什么需要它
线程池是什么
线程池是一个高效的并发处理工具它类似于你家里的管家可以有效地管理和调度工作任务线程。 想象一下你有很多家务要做比如洗衣服、做饭、打扫等如果每件事情都一个人去做可能效率不高而且容易混乱。但如果有一个管家可以根据不同的情况安排人手就会更有条理和高效。 在Java项目开发中线程池的作用就类似于这个管家它提前创建好一批线程类似于家里的工人这些线程随时待命等待分配任务。当有任务需要处理时不需要每次都创建新的线程雇新工人而是从线程池中取出一个空闲的线程已有的工人分配任务给它执行执行完毕后该线程可以被复用而不是立即销毁。
在代码层面一个简单的线程池的创建可以像这样
// 创建了一个固定大小为10的线程池
ExecutorService executor Executors.newFixedThreadPool(10);为什么需要它
这种预先创建并重复利用线程的方式极大地节省了线程创建和销毁的开销同时避免了系统因为线程过多而导致资源耗尽或性能下降的问题。
通过合理配置线程池的大小和参数可以更好地控制并发执行的线程数量从而优化系统的性能和响应速度。
2 线程池的参数有哪些
线程池的参数主要是用来配置它如何管理和调度线程的。 想象一下你在为一个派对准备你需要决定几个桌子和椅子以及每个桌子上坐几个人。这些参数决定了整个派对的布置和效率。 核心池大小corePoolSize指定了线程池中始终保持活动状态的线程数。即使没有任务执行这些线程也会被保留。
就像派对上至少需要几个人来保证基本的服务这些线程会一直存在即使没有任务可做。
// 设置核心池大小为5
int corePoolSize 5; 最大池大小maximumPoolSize定义了线程池中允许的最大线程数。当队列满了且线程池中的线程数小于最大池大小时新任务会创建新线程执行。
相当于在派对上你愿意容忍的最多人数。如果任务多就会雇佣更多的人来处理。
// 设置最大池大小为10
int maximumPoolSize 10; 任务队列workQueue用来保存等待执行的任务。常见的队列包括有界队列和无界队列和先进先出队列FIFO和优先级队列它们影响着任务的排队策略。
就像派对上的等候区这里存放着还没坐下的客人。
// 使用有界队列最大容量为100
BlockingQueueRunnable workQueue new LinkedBlockingQueue(100); 线程存活时间keepAliveTime定义了线程空闲多久后被销毁。这个参数只有在线程池的线程数大于核心池大小时才会生效。
就像派对上的工作人员如果长时间没事做会被安排离开。
// 线程空闲时间为60秒
long keepAliveTime 60;
// 时间单位为秒
TimeUnit unit TimeUnit.SECONDS; 拒绝策略rejectedExecutionHandler决定了当任务无法加入线程池时的处理方式。例如可以选择直接抛出异常或者在调用者线程中执行任务。
就像派对上人满为患需要安排后面来的客人去别的场地。
// 默认的拒绝策略抛出异常
RejectedExecutionHandler handler new ThreadPoolExecutor.AbortPolicy(); 通过合理配置这些参数可以根据应用程序的需求和系统的负载来优化线程池的性能和资源利用率。
例如在处理大量短时任务的场景中可以增加核心池大小和任务队列的容量以提高响应速度和任务处理的并发性。
3 不同类型的线程池有哪些配置
线程池根据不同的场景和需求提供了灵活的配置选项通过合理地选择和配置可以最大化地利用系统资源提高任务执行的效率和响应速度。
固定大小线程池FixedThreadPool有固定数量的线程不会根据任务数量的增减而调整。适合于任务数量已知且需要快速执行的情况。
像在派对中设置几张大小固定的桌子和椅子每张桌子上有固定数量的座位。每个人都有固定的位置确保派对期间座位不会超出预期。
// 创建一个固定大小为5的线程池
ExecutorService executor Executors.newFixedThreadPool(5); 缓存线程池CachedThreadPool会根据需要创建新的线程而且在线程空闲一段时间后会回收适合处理大量短期异步任务。
桌子和椅子根据人数的需要动态增加或减少以适应派对规模的变化。
// 创建一个根据需求自动调整大小的线程池
ExecutorService executor Executors.newCachedThreadPool(); 单线程化线程池SingleThreadExecutor只有一个工作线程适合需要顺序执行任务的场景保证任务按照提交的顺序执行。
所有的客人任务一个接一个地坐在这张桌子旁边确保每个任务按顺序执行。
// 创建一个只有一个线程的线程池
ExecutorService executor Executors.newSingleThreadExecutor(); 定时执行线程池ScheduledThreadPool可以延时或定期执行任务比如每隔一段时间执行一次任务或者延迟一段时间后执行。
就像在派对中设置了几张定时餐桌每张桌子预定在特定的时间供特定数量的人坐下。
// 创建一个具有固定大小为3的定时执行线程池
ScheduledExecutorService executor Executors.newScheduledThreadPool(3); 工作窃取线程池ForkJoinPool是一种特殊的线程池适用于并行任务的处理每个线程都有自己的工作队列能够高效处理递归划分的任务。
// 创建一个工作窃取线程池
ForkJoinPool executor new ForkJoinPool(); 每一天都是起跑线勇敢迈出第一步