Eşzamansız İstekler
sendAsync ve CompletableFuture
Eşzamansız İstekler, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Asenkron İstekler
Her HTTP çağrısında beklemek iş parçacıklarını israf eder. JDK HTTP istemcisi, hemen bir CompletableFuture döndüren ve işi bir arka plan yürütücüsünde gerçekleştiren sendAsync yöntemini sunar.
Bu sayede birçok isteği eşzamanlı olarak başlatabilir ve iş parçacıklarını elle yönetmeden sonuçlarını birleştirebilirsiniz.
send ve sendAsync
İmzalar, döndürdükleri değer bakımından farklıdır:
- send,
HttpResponse<T>döndürür ve işlemi bloklar;IOExceptionileInterruptedExceptionbildirimlerini içerir. - sendAsync,
CompletableFuture<HttpResponse<T>>döndürür ve hiçbir zaman bloklamaz; hatalar gelecek nesnesi üzerinden iletilir.
Temel sendAsync Çağrısı
sendAsync, send ile aynı isteği ve BodyHandler'ı alır. Döndürülen gelecek nesnesi, yanıt hazır olduğunda tamamlanır.
import java.net.URI;
import java.net.http.*;
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
CompletableFuture<HttpResponse<String>> future =
client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Request sent, future created");
}
}thenApply ile Dönüştürme
Sonuç gelir gelmez onu dönüştürmek için thenApply kullanın — örneğin, yanıtın gövdesini çıkarmak için.
Bu işlem, önceki aşamayı tamamlayan iş parçacığında senkron olarak yürütülür.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) throws Exception {
CompletableFuture<String> future =
CompletableFuture.completedFuture("OK 200")
.thenApply(body -> "Length=" + body.length());
System.out.println(future.get());
}
}thenAccept ile Tüketme
Yalnızca bir yan etki istiyor ve dönüş değeri istemiyorsanız thenAccept kullanın. Bir Consumer alır ve bir CompletableFuture<Void> üretir.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) throws Exception {
CompletableFuture<Void> done =
CompletableFuture.completedFuture("payload")
.thenAccept(b -> System.out.println("Received: " + b));
done.get();
}
}join ile Bloklama
main içinden asenkron bir sonucu beklemek için (denetimsiz) join() veya (denetimli) get() çağrısını yapın. Gerçek bir sunucuda bloklamak yerine aşamaları birbirine bağlarsınız.
join(), başarısızlıkları denetimsiz bir CompletionException içinde sarar.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<Integer> f =
CompletableFuture.supplyAsync(() -> 21).thenApply(n -> n * 2);
int result = f.join();
System.out.println("Result: " + result);
}
}exceptionally ile Hataları Yönetme
exceptionally, bir aşama başarısız olduğunda bir yedek değer sağlar ve işlem hattını kurtarır.
Bu yöntem, asenkron HTTP akışının bir ağ hatası nedeniyle sonlanmasını önlemenizi sağlar.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> f = CompletableFuture
.<String>supplyAsync(() -> { throw new RuntimeException("boom"); })
.exceptionally(ex -> "fallback: " + ex.getMessage());
System.out.println(f.join());
}
}İki İsteği Birleştirme
thenCombine, iki bağımsız gelecek nesnesinin tamamlanmasını bekler ve sonuçlarını birleştirir. Asenkron HTTP ile bu yöntem, iki uç noktadan paralel olarak veri alır ve gövdeleri birleştirir.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> b = CompletableFuture.supplyAsync(() -> "World");
String combined = a.thenCombine(b, (x, y) -> x + " " + y).join();
System.out.println(combined);
}
}Birçok İsteği Paralel Çalıştırma
Bir istek grubunu çalıştırmak için her gelecek nesnesini bir listede toplayın, ardından hepsini beklemek üzere CompletableFuture.allOf(...) kullanın.
allOf, CompletableFuture<Void> döndürür; tek tek sonuçları daha sonra okursunuz.
import java.util.*;
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
List<CompletableFuture<Integer>> futures = new ArrayList<>();
for (int i = 1; i <= 3; i++) {
int n = i;
futures.add(CompletableFuture.supplyAsync(() -> n * n));
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
for (var f : futures) System.out.println(f.join());
}
}Asenkron Örüntü Özeti
Tipik bir asenkron HTTP işlem hattı şöyle görünür:
client.sendAsync(req, BodyHandlers.ofString())- Gövdeyi almak için
.thenApply(HttpResponse::body) - Gövdeyi tüketmek için
.thenAccept(System.out::println) - Kurtarmak için
.exceptionally(ex -> ...)
Ağ beklenirken hiçbir iş parçacığı bloklanmaz.
Ne Zaman Asenkron Kullanılmalı
Birçok eşzamanlı çağrı yaptığınızda, birkaç hizmete dağıldığınızda veya tepkisel/bloklamayan bir sunucunun içinde çalıştığınızda sendAsync seçin. Bloklamanın sorun olmadığı basit betikler ve tek seferlik çağrılar için send seçin.
Hızlı Kontrol
Asenkron istekleri anlayıp anlamadığınızı denetleyin.
Özet
Bloklamayan HTTP çağrıları yapmayı öğrendiniz:
- sendAsync, işlemi bloklamak yerine bir
CompletableFuturedöndürür. - thenApply / thenAccept, sonucu dönüştürür ve tüketir.
- exceptionally, başarısızlık durumunda bir yedek değer sağlar.
- thenCombine iki paralel çağrıyı birleştirir; allOf bir istek grubunu bekler.
- Asenkron yaklaşım, yüksek eşzamanlılık ve tepkisel sunuculara uygundur; senkron yaklaşım ise basit betiklere uygundur.
Sıkça Sorulan Sorular
“Eşzamansız İstekler” dersi ücretsiz mi?
Evet — “Eşzamansız İstekler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Eşzamansız İstekler” dersinde ne öğreneceğim?
sendAsync ve CompletableFuture Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Eşzamansız İstekler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- java.net.http.HttpClient
- Eşzamansız İstekler
- İstek Gövdeleri ve Üst Bilgiler
- Yanıtları İşleme