# Java中Executor的使用方法 ## 一、Executor框架概述 Java中的Executor框架是Java 5引入的一套线程管理机制,它提供了一种将任务提交与任务执行分离的机制。通过Executor,开发者可以专注于任务逻辑的编写,而无需手动管理线程的创建和生命周期。 ### 1.1 为什么需要Executor - 传统线程创建方式(直接new Thread)存在资源消耗大、难以管理的问题 - Executor提供了线程池功能,实现线程复用 - 统一的任务提交接口,简化并发编程 ### 1.2 核心接口关系
Executor ├── ExecutorService │ ├── ScheduledExecutorService │ └── AbstractExecutorService └── ThreadPoolExecutor
## 二、基本使用方法 ### 2.1 创建ExecutorService ```java // 创建固定大小的线程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); // 创建单线程的线程池 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); // 创建可缓存的线程池 ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 执行Runnable任务 executor.execute(() -> { System.out.println("执行任务"); }); // 提交Callable任务并获取Future Future<String> future = executor.submit(() -> { Thread.sleep(1000); return "任务结果"; });
// 平缓关闭,不再接受新任务,等待已提交任务完成 executor.shutdown(); // 立即关闭,尝试中断正在执行的任务 executor.shutdownNow();
ThreadPoolExecutor executor = new ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲线程存活时间 TimeUnit unit, // 时间单位 BlockingQueue<Runnable> workQueue, // 工作队列 ThreadFactory threadFactory, // 线程工厂 RejectedExecutionHandler handler // 拒绝策略 );
队列类型 | 特点 |
---|---|
ArrayBlockingQueue | 有界队列,FIFO |
LinkedBlockingQueue | 无界队列(默认),FIFO |
SynchronousQueue | 不存储元素的阻塞队列 |
PriorityBlockingQueue | 具有优先级的无界队列 |
策略类 | 行为 |
---|---|
AbortPolicy | 直接抛出RejectedExecutionException |
CallerRunsPolicy | 由调用线程执行该任务 |
DiscardPolicy | 直接丢弃任务 |
DiscardOldestPolicy | 丢弃队列中最旧的任务 |
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3); // 延迟执行 scheduler.schedule(() -> { System.out.println("延迟3秒执行"); }, 3, TimeUnit.SECONDS); // 固定频率执行 scheduler.scheduleAtFixedRate(() -> { System.out.println("每2秒执行一次"); }, 1, 2, TimeUnit.SECONDS);
ExecutorService executor = Executors.newFixedThreadPool(2); Future<Integer> future = executor.submit(() -> { Thread.sleep(1000); return 42; }); // 获取结果(阻塞) try { Integer result = future.get(); System.out.println("结果: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }
ExecutorService executor = Executors.newFixedThreadPool(3); CompletionService<String> completionService = new ExecutorCompletionService<>(executor); // 提交多个任务 completionService.submit(() -> "任务1"); completionService.submit(() -> "任务2"); // 获取已完成的任务结果 for (int i = 0; i < 2; i++) { Future<String> completedFuture = completionService.take(); System.out.println(completedFuture.get()); }
executor.shutdown(); try { if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { executor.shutdownNow(); } } catch (InterruptedException e) { executor.shutdownNow(); Thread.currentThread().interrupt(); }
Java的Executor框架为并发编程提供了强大而灵活的工具。通过合理配置线程池参数、选择合适的队列和拒绝策略,可以构建高效稳定的并发系统。掌握Executor的使用方法,能够显著提升Java应用的并发处理能力和资源利用率。
注意:实际项目中建议使用ThreadPoolExecutor构造函数创建线程池,而不是Executors工厂方法,以便更精确地控制线程池行为。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。