Sobes.tech
Middle

Kam skirtas CompletableFuture Java?

sobes.tech AI

Atsakymas iš AI

CompletableFuture naudojamas asinchroniniam užduočių vykdymui ir asinchroninių operacijų komponavimui. Jis atstovauja asinchroninės operacijos rezultatą, kuris gali būti užbaigtas ateityje.

Pagrindiniai privalumai ir naudojimo priežastys:

  • Asinchroninis vykdymas: leidžia vykdyti užduotis fono režimu, neblokuojant pagrindinio srauto.
  • Asinchroninių operacijų komponavimas: suteikia galimybę sujungti kelias asinchronines užduotis, nustatant, kaip jos turi būti vykdomos nuosekliai arba lygiagrečiai, ir apdorojant jų rezultatus.
  • Išimčių apdorojimas: teikia mechanizmus klaidų apdorojimui asinchroninėse užduotyse.
  • Lankstumas: palaiko įvairius metodus rezultatui apdoroti (pvz., funkcijos taikymas, sekantis užduoties vykdymas) ir vykdymo srautų apibrėžimą.

Naudojimo pavyzdžiai:

  1. Keletas nepriklausomų užduočių vykdymas lygiagrečiai ir jų užbaigimo laukimas:

    // Pavyzdys dviejų užduočių vykdymo lygiagrečiai
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        // Ilga operacija 1
        return "Rezultatas 1";
    });
    
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
        // Ilga operacija 2
        return "Rezultatas 2";
    });
    
    CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
    
    combinedFuture.join(); // Laukti abiejų užduočių pabaigos
    
  2. Sekančių asinchroninių operacijų vykdymas:

    // Sekančių užduočių pavyzdys
    CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Pradinis reikšmė");
    
    CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> {
        // Rezultato transformavimas
        return result.length();
    });
    
    transformedFuture.thenAccept(length -> {
        System.out.println("Eilutės ilgis: " + length);
    });
    
  3. Išimčių apdorojimas:

    // Išimčių apdorojimo pavyzdys
    CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> {
        if (true) {
            throw new RuntimeException("Įvyko klaida");
        }
        return "Sėkmė";
    }).exceptionally(ex -> {
        System.err.println("Klaidos apdorojimas: " + ex.getMessage());
        return "Apdorota klaida"; // Atsarginė reikšmė
    });
    
    System.out.println(errorFuture.join());