進階執行緒模式

Java 程式碼最佳化

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

執行緒池基礎

建立執行緒很昂貴!

$$

執行緒池:

  • 重複利用現有執行緒
  • 控制同時執行的執行緒數
  • 透過 ExecutorService 介面管理
Java 程式碼最佳化

建立執行緒池

// Fixed thread pool with 4 threads
ExecutorService fixedPool = Executors.newFixedThreadPool(4);


// Cached thread pool that grows as needed ExecutorService cachedPool = Executors.newCachedThreadPool();
// Single-threaded executor ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
Java 程式碼最佳化

提交工作

ExecutorService executor = Executors.newFixedThreadPool(4);

// Submit a task with no return value
executor.execute(() -> System.out.println("Simple task"));

// Submit a task with a return value (Callable)
Future<Integer> future = executor.submit(() -> {
    Thread.sleep(1000);
    return 42;
});

// Get result from Future (blocks until complete)
int result = future.get();
Java 程式碼最佳化

關閉執行器

// Signal shutdown, but continue running existing tasks
executor.shutdown();


// Wait for termination (with timeout) boolean terminated = executor.awaitTermination(5, TimeUnit.SECONDS);
// Force immediate shutdown, canceling running tasks executor.shutdownNow();
Java 程式碼最佳化

CompletableFuture 簡介

  • CompletableFuture
  • 自 Java 8 起屬於並行 API 一部分
  • 現代的非同步程式設計方式
  • 可手動完成,或透過 Function 完成
  • 允許用回呼串接操作
  • 可搭配或不搭配明確的執行緒池
Java 程式碼最佳化

建立 CompletableFuture

// Run async with default executor
CompletableFuture<Void> runAsync = 
    CompletableFuture.runAsync(() -> performTask());

// Supply async with custom executor ExecutorService executor = Executors.newCachedThreadPool(); CompletableFuture<String> supplyAsync = CompletableFuture.supplyAsync(() -> fetchData(), executor);
Java 程式碼最佳化

串接操作

CompletableFuture<String> future = CompletableFuture
    .supplyAsync(() -> fetchUserData(userId))
    .thenApply(data -> extractUsername(data))
    .exceptionally(ex -> "Unknown user");

// Access to result when ready
future.thenAccept(result -> System.out.println(result));
Java 程式碼最佳化

一起來練習吧!

Java 程式碼最佳化

Preparing Video For Download...