# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。