Sobes.tech
Middle

Kam ir nepieciešams CompletableFuture Java?

sobes.tech AI

Atbilde no AI

CompletableFuture tiek izmantots asinhronai uzdevumu izpildei un asinhrono operāciju sastāvdaļu veidošanai. Tas pārstāv asinhronas operācijas rezultātu, kas var tikt pabeigts nākotnē.

Galvenās priekšrocības un iemesli tā izmantošanai:

  • Asinhrona izpilde: ļauj veikt uzdevumus fonā, neblokējot galveno plūsmu.
  • Asinhrono operāciju sastāvdaļu veidošana: dod iespēju saistīt vairākas asinhronas uzdevumus, noteikt, kā tie jāizpilda secīgi vai paralēli, un apstrādāt to rezultātus.
  • Izņēmumu apstrāde: nodrošina mehānismus kļūdu apstrādei asinhronās uzdevumos.
  • Elastīgums: atbalsta dažādas metodes rezultāta apstrādei (piemēram, funkcijas piemērošana, nākamā uzdevuma izpilde) un izpildes plūsmu noteikšanu.

Piemēri lietošanai:

  1. Dažu neatkarīgu uzdevumu paralēla izpilde un to pabeigšanas gaidīšana:

    // Piemērs divu uzdevumu paralēlai izpildei
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        // Ilga operācija 1
        return "Rezultāts 1";
    });
    
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
        // Ilga operācija 2
        return "Rezultāts 2";
    });
    
    CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
    
    combinedFuture.join(); // Gaidīt abu uzdevumu pabeigšanu
    
  2. Seku asinhrono operāciju izpilde:

    // Seku uzdevumu piemērs
    CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Sākotnējā vērtība");
    
    CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> {
        // Rezultāta pārveidošana
        return result.length();
    });
    
    transformedFuture.thenAccept(length -> {
        System.out.println("Rindas garums: " + length);
    });
    
  3. Izņēmumu apstrāde:

    // Izņēmumu apstrādes piemērs
    CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> {
        if (true) {
            throw new RuntimeException("Radusies kļūda");
        }
        return "Veiksme";
    }).exceptionally(ex -> {
        System.err.println("Kļūdu apstrāde: " + ex.getMessage());
        return "Apstrādāta kļūda"; // Rezerves vērtība
    });
    
    System.out.println(errorFuture.join());