java.util.concurrent.Executors
是一個工廠類,提供了一些靜態方法來創建各種類型的線程池。這些方法簡單易用,可以快速創建常見的線程池類型。以下是 Executors
提供的主要創建線程池的方法及其特性:
1.?newFixedThreadPool(int nThreads)
創建一個固定大小的線程池。線程池包含固定數量的線程,這些線程在整個生命周期中保持不變。如果所有線程都在忙于執行任務,其他任務將在隊列中等待。
特點:
- 固定數量的線程。
- 適用于負載較為穩定的場景。
java復制代碼
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
2.?newCachedThreadPool()
創建一個可根據需要創建新線程的線程池。如果線程池中的線程在前一次任務執行后60秒內沒有被復用,那么該線程將被終止并從池中移除。當執行很多短期異步任務時,可以提高程序性能。線程池規模不固定,可以根據需求自動調整大小。
特點:
- 線程數量動態擴展。
- 適用于執行大量短期任務的場景。
java復制代碼
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
3.?newSingleThreadExecutor()
創建一個單線程的線程池。此線程池只有一個線程,所有任務將被順序執行。適用于需要保證任務按順序執行的場景。
特點:
- 單個線程,保證任務順序執行。
- 適用于需要順序執行任務的場景。
java復制代碼
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
4.?newScheduledThreadPool(int corePoolSize)
創建一個線程池,可以定期或延時執行任務。適用于需要定時任務或延時任務的場景。
特點:
- 定期或延時執行任務。
- 支持固定數量的線程。
java復制代碼
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
5.?newSingleThreadScheduledExecutor()
創建一個單線程的調度線程池。類似于 newSingleThreadExecutor()
,但具有調度功能,可以定期或延時執行任務。
特點:
- 單個線程,保證任務按順序執行。
- 支持定期或延時任務。
java復制代碼
ScheduledExecutorService singleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
例子
以下是如何使用這些方法創建和使用線程池的示例:
java復制代碼
import java.util.concurrent.*; public class ExecutorsExample { public static void main(String[] args) { // newFixedThreadPool example ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4); submitTasks(fixedThreadPool, "FixedThreadPool"); // newCachedThreadPool example ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); submitTasks(cachedThreadPool, "CachedThreadPool"); // newSingleThreadExecutor example ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); submitTasks(singleThreadExecutor, "SingleThreadExecutor"); // newScheduledThreadPool example ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2); scheduleTasks(scheduledThreadPool, "ScheduledThreadPool"); // newSingleThreadScheduledExecutor example ScheduledExecutorService singleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor(); scheduleTasks(singleThreadScheduledExecutor, "SingleThreadScheduledExecutor"); } private static void submitTasks(ExecutorService executorService, String poolName) { for (int i = 0; i < 5; i++) { final int taskId = i; executorService.submit(() -> { System.out.println(poolName + " executing task " + taskId + " on thread " + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); } executorService.shutdown(); } private static void scheduleTasks(ScheduledExecutorService scheduledExecutorService, String poolName) { for (int i = 0; i < 5; i++) { final int taskId = i; scheduledExecutorService.schedule(() -> { System.out.println(poolName + " executing task " + taskId + " on thread " + Thread.currentThread().getName()); }, 2, TimeUnit.SECONDS); } scheduledExecutorService.shutdown(); } }
總結
Executors
工廠類提供了便捷的方法來創建常見類型的線程池:
newFixedThreadPool
:固定大小的線程池,適用于負載較為穩定的場景。newCachedThreadPool
:可根據需要創建新線程的線程池,適用于執行大量短期異步任務。newSingleThreadExecutor
:單線程的線程池,適用于需要順序執行任務的場景。newScheduledThreadPool
:支持定期或延時任務的線程池,適用于需要定時任務的場景。newSingleThreadScheduledExecutor
:單線程的調度線程池,適用于需要順序執行定期或延時任務的場景。
這些方法提供了簡單易用的接口,可以滿足各種常見的并發編程需求。