java非同步程式設計

Josen_Earth發表於2024-09-08

Java 提供了幾種非同步程式設計方式,尤其是在 Java 8 引入的 CompletableFuture 和 Java 11 的 HttpClient 中,能夠實現非同步操作。

1. CompletableFuture (Java 8)

CompletableFuture 是 Java 中用於處理非同步任務的類,它提供了類似於 C# async/await 的功能,可以鏈式操作並組合多個非同步任務。

示例:使用 CompletableFuture

import java.util.concurrent.CompletableFuture;

public class AsyncExample {
    public static void main(String[] args) {
        // 非同步呼叫
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 模擬耗時操作
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Hello, World!";
        });

        // 非同步完成後執行操作
        future.thenAccept(result -> {
            System.out.println("Result: " + result);
        });

        // 繼續執行其他任務
        System.out.println("Doing other work...");

        // 主執行緒等待非同步操作完成
        future.join();  // 等待非同步任務完成
    }
}

在這個示例中,supplyAsync 方法用於啟動一個非同步任務,thenAccept 用於處理任務完成後的結果。類似於 C# 中的 awaitjoin() 會阻塞,直到非同步任務完成。

2. HttpClient (Java 11)

Java 11 引入了新的 HttpClient,支援非同步 HTTP 請求,結合 CompletableFuture 實現非同步呼叫。

示例:使用 HttpClient 進行非同步 HTTP 請求

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;

public class AsyncHttpClientExample {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(new URI("https://jsonplaceholder.typicode.com/posts/1"))
            .build();

        // 非同步傳送請求
        CompletableFuture<HttpResponse<String>> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());

        // 處理響應
        future.thenApply(HttpResponse::body)
              .thenAccept(System.out::println)
              .join();  // 等待非同步任務完成
    }
}

這裡的 sendAsync 方法是非阻塞的,返回一個 CompletableFuture,可以在響應準備好時處理。

3. 使用第三方庫

如果你想要更接近 C# async/await 語法的體驗,可以使用第三方庫如 Project LoomReactiveX (RxJava),它們可以幫助簡化非同步程式設計,特別是在併發任務較多的場景下。

總結:

雖然 Java 沒有像 C# 的 asyncawait 這樣的語法糖,但透過 CompletableFuture 和 Java 11 的 HttpClient,可以實現類似的非同步程式設計模式。如果需要更復雜的非同步控制或更接近 async/await 的模式,可以藉助一些第三方庫。

相關文章