Sobes.tech
Middle

Milleks on Java-s vajalik CompletableFuture?

sobes.tech AI

Vastus AI-lt

CompletableFuture kasutatakse asünkroonsete ülesannete täitmiseks ja asünkroonsete operatsioonide koostamiseks. See esindab asünkroonse operatsiooni tulemust, mis võib tulevikus olla valmis.

Peamised eelised ja kasutamise põhjused:

  • Asünkroonne täitmine: võimaldab ülesandeid taustal täita, mitte blokeerides peamist voogu.
  • Asünkroonsete operatsioonide koostamine: võimaldab ühendada mitu asünkroonset ülesannet, määrates, kuidas need peaksid järjekorras või paralleelselt täituma, ning töödelda nende tulemusi.
  • Erandite töötlemine: pakub mehhanisme vigade töötlemiseks asünkroonsetes ülesannetes.
  • Paindlikkus: toetab erinevaid meetodeid tulemuse töötlemiseks (nt funktsiooni rakendamine, järgmise ülesande täitmine) ning täitmise voogude määratlemist.

Kasutusnäited:

  1. Mitme sõltumatu ülesande paralleelne täitmine ja nende lõpetamise ootamine:

    // Näide kahe ülesande paralleelsest täitmisest
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        // Pikk operatsioon 1
        return "Tulemus 1";
    });
    
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
        // Pikk operatsioon 2
        return "Tulemus 2";
    });
    
    CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
    
    combinedFuture.join(); // Ootamine mõlema ülesande lõpetamiseks
    
  2. Järgneva asünkroonse operatsiooni täitmine:

    // Näide järjestikustest asünkroonsetest ülesannetest
    CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Algväärtus");
    
    CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> {
        // Tulemuse teisendamine
        return result.length();
    });
    
    transformedFuture.thenAccept(length -> {
        System.out.println("Stringi pikkus: " + length);
    });
    
  3. Erandite töötlemine:

    // Näide erandite töötlemisest
    CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> {
        if (true) {
            throw new RuntimeException("Viga tekkis");
        }
        return "Edu";
    }).exceptionally(ex -> {
        System.err.println("Viga töötlemine: " + ex.getMessage());
        return "Töödeldud viga"; // Asendusväärtus
    });
    
    System.out.println(errorFuture.join());