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# 中的 await
,join()
會阻塞,直到非同步任務完成。
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 Loom 或 ReactiveX (RxJava),它們可以幫助簡化非同步程式設計,特別是在併發任務較多的場景下。
總結:
雖然 Java 沒有像 C# 的 async
和 await
這樣的語法糖,但透過 CompletableFuture
和 Java 11 的 HttpClient
,可以實現類似的非同步程式設計模式。如果需要更復雜的非同步控制或更接近 async/await
的模式,可以藉助一些第三方庫。