马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Java线程池种类及具体应用场景
在实际开辟中,选择符合的线程池范例至关紧张,差别场景有差别的线程池需求。本文将连合线程池种类和具体应用示例,具体阐明每种线程池的利用场景和实用环境。
一、固定巨细线程池(FixedThreadPool)
特点
- 线程数量固定:线程池中的线程数固定,凌驾的任务会被放入队列期待实行。
- 任务队列无界:会生存全部期待实行的任务。
实用场景
实用于任务量确定且须要长期运行的场景,比方:
- 处置惩罚固定命目标并发任务。
- 须要对线程数量严格控制,制止资源耗尽。
应用示例:文件批量处置惩罚
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class FixedThreadPoolExample {
- public static void main(String[] args) {
- ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
- // 模拟批量处理文件
- for (int i = 1; i <= 10; i++) {
- int fileNumber = i;
- fixedThreadPool.execute(() -> {
- System.out.println(Thread.currentThread().getName() + " 正在处理文件 " + fileNumber);
- try {
- Thread.sleep(1000); // 模拟文件处理耗时
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- });
- }
- fixedThreadPool.shutdown();
- }
- }
复制代码 输出示例:- pool-1-thread-1 正在处理文件 1
- pool-1-thread-2 正在处理文件 2
- pool-1-thread-3 正在处理文件 3
复制代码 二、单线程池(SingleThreadExecutor)
特点
- 单线程:始终只有一个线程实行任务,任务按提交次序依次实行。
- 任务队列无界:任务不会丢失。
实用场景
实用于须要按次序实行任务的场景,比方:
应用示例:按次序写入日志
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class SingleThreadExecutorExample {
- public static void main(String[] args) {
- ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
- // 模拟日志
写入 - for (int i = 1; i <= 5; i++) {
- int logNumber = i;
- singleThreadExecutor.execute(() -> {
- System.out.println("写入日志:" + logNumber);
- });
- }
- singleThreadExecutor.shutdown();
- }
- }
复制代码 输出示例: 三、可缓存线程池(CachedThreadPool)
特点
- 线程数动态增长:没有核心线程,全部任务都创建新线程处置惩罚;线程空闲超时后会被烧毁。
- 任务队列无界:适当短期大量任务。
实用场景
实用于实行大量短生命周期的任务,比方:
应用示例:并发哀求处置惩罚
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class CachedThreadPoolExample {
- public static void main(String[] args) {
- ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
- // 模拟并发请求
- for (int i = 1; i <= 10; i++) {
- int requestNumber = i;
- cachedThreadPool.execute(() -> {
- System.out.println(Thread.currentThread().getName() + " 正在处理请求 " + requestNumber);
- });
- }
- cachedThreadPool.shutdown();
- }
- }
复制代码 输出示例:- pool-1-thread-1 正在处理请求 1
- pool-1-thread-2 正在处理请求 2
- pool-1-thread-3 正在处理请求 3
复制代码 四、定时任务线程池(ScheduledThreadPool)
特点
- 支持定时和周期性任务:可以耽误实行任务,也可以周期性实行任务。
- 线程数固定:线程池巨细由开辟者设置。
实用场景
实用于须要定时或周期性实行任务的场景,比方:
应用示例:定时任务调治
- import java.util.concurrent.Executors;
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
- public class ScheduledThreadPoolExample {
- public static void main(String[] args) {
- ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
- // 延迟3秒执行任务
- scheduledThreadPool.schedule(() -> {
- System.out.println("任务延迟3秒后执行");
- }, 3, TimeUnit.SECONDS);
- // 每2秒执行一次任务
- scheduledThreadPool.scheduleAtFixedRate(() -> {
- System.out.println("周期任务,每2秒执行一次");
- }, 1, 2, TimeUnit.SECONDS);
- // 每3秒执行一次任务
- scheduledThreadPool.scheduleWithFixedDelay(() -> {
- System.out.println("固定延迟任务,每3秒延迟执行");
- }, 1, 3, TimeUnit.SECONDS);
- }
- }
复制代码 五、自界说线程池
特点
- 根据业务需求机动设置参数。
- 通过自界说拒绝计谋、任务队列、线程工厂等满意特定需求。
实用场景
实用于对线程池有特别要求的场景,比方:
应用示例:控制线程数量并记录日志
- import java.util.concurrent.*;
- public class CustomThreadPoolExample {
- public static void main(String[] args) {
- ThreadPoolExecutor customThreadPool = new ThreadPoolExecutor(
- 2, // 核心线程数
- 4, // 最大线程数
- 60, // 空闲线程存活时间
- TimeUnit.SECONDS, // 时间单位
- new ArrayBlockingQueue<>(2), // 有界队列
- r -> { // 自定义线程工厂
- Thread thread = new Thread(r);
- thread.setName("自定义线程-" + thread.getId());
- return thread;
- },
- new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
- );
- for (int i = 1; i <= 10; i++) {
- int taskNumber = i;
- customThreadPool.execute(() -> {
- System.out.println(Thread.currentThread().getName() + " 正在执行任务 " + taskNumber);
- try {
- Thread.sleep(1000); // 模拟任务耗时
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- });
- }
- customThreadPool.shutdown();
- }
- }
复制代码 总结
线程池范例特点应用场景示例应用FixedThreadPool固定巨细线程池,无界任务队列并发量稳固的长期任务,任务耗时较长文件处置惩罚SingleThreadExecutor单线程,按次序实行任务须要任务次序实行的场景日志记录CachedThreadPool动态线程数,可快速处置惩罚大量短任务短生命周期的并发任务并发哀求处置惩罚ScheduledThreadPool支持定时和周期性任务定时任务、周期性任务调治任务提示,数据同步自界说线程池参数机动,满意特别需求高级任务管理限定队列巨细,拒绝计谋根据实际场景选择符合的线程池,既能优化体系性能,又能公道分配资源。
|