0Pricing
Java Academy · Ders

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; IOException ile InterruptedException bildirimlerini 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 CompletableFuture dö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

  1. java.net.http.HttpClient
  2. Eşzamansız İstekler
  3. İstek Gövdeleri ve Üst Bilgiler
  4. Yanıtları İşleme
← Java Academy Sayfasına Dön