A TamamlanabilirGelecek Asenkron programlama için kullanılır. Asenkron programlama, engellemeyen kod yazmak anlamına gelir. Bir görevi ana uygulama iş parçacığından ayrı bir iş parçacığında çalıştırır ve ana iş parçacığını ilerlemesi, tamamlanması veya başarısızlığı hakkında bilgilendirir.
Bu şekilde ana iş parçacığı engellemez veya görevin tamamlanmasını beklemez. Diğer görevler paralel olarak yürütülür. Paralellik programın performansını artırır.
CompletableFuture, Java'daki bir sınıftır. Java.util.cocurrent paketine aittir. CompletionStage ve Future arayüzünü uygular.
Tamamlama Aşaması
- Bir eylemi gerçekleştirir ve başka bir tamamlama aşaması tamamlandığında bir değer döndürür.
- Bir görevin diğer görevleri tetikleyebilecek modeli.
Dolayısıyla bir zincirin unsurudur.
Birden fazla iş parçacığı tamamlamaya çalıştığında (istisnai olarak tamamlama veya CompletableFuture'ı iptal etme), bunlardan yalnızca biri başarılı olur.
git ekle --tümü
Gelecek ve Tamamlanabilir Gelecek
CompletableFuture, Java 8'de tanıtılan Java'nın Future API'sinin bir uzantısıdır.
Eşzamansız Programlama için bir Gelecek kullanılır. İki yöntem sağlar, isDone() ve get(). Yöntemler, tamamlandığında hesaplamanın sonucunu alır.
Geleceğin Sınırlamaları
- Bir Gelecek karşılıklı olarak tamamlanamaz.
- Engelleme olmadan bir Geleceğin sonucu üzerinde daha fazla işlem yapamayız.
- Geleceğin herhangi bir istisna işlemesi yoktur.
- Birden fazla geleceği birleştiremeyiz.
Geleceğin pek çok sınırlaması var, bu yüzden CompletableFuture'a sahibiz. CompletableFuture, birden fazla Vadeli İşlem oluşturmak, zincirlemek ve birleştirmek için geniş bir yöntem seti sağlar. Ayrıca kapsamlı istisna işleme desteğine de sahiptir.
Tamamlanabilir Bir Gelecek Yaratmak
CompletableFuture'ı yalnızca aşağıdaki bağımsız değişkensiz yapıcıyı kullanarak oluşturabiliriz.
CompletableFuture CompletableFuture = new CompletableFuture();
Örnek
En sık kullanılan CompletableFuture yöntemleri şunlardır:
import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } }
Çıktı:
CompletableFuture'ın İstisna İşlemeleri
Beş CF'yi temsil eden aşağıdaki şekli düşünün:
Beş CF'nin yürütüldüğünü ve CF21'in bir istisna oluşturduğunu varsayalım, o zaman tüm bağlı CF'ler (CF31 ve CF41) hatalıdır. Bu demektir:
kylie jenner kaç yaşında
- isCompletedExceptionally() yöntemine yapılan çağrı true değerini döndürür.
- get() çağrısı, kök İstisnaya neden olan bir ExecutionException oluşturur.
Bir istisna dışında CF30'u oluşturduğumuz aşağıdaki şekli düşünün.
CF21 normal şekilde çalıştığında CF30 sadece değeri iletir. Bir istisna ortaya çıkarsa, CF30 bunu ele alır ve CF31 için değer üretir.
Bir istisnayı ele almanın üç yöntemi vardır:
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);