Vadeli
Futures , Java 5'de (2004) tanıtıldı. Bunlar henüz tamamlanmamış bir operasyonun sonucu olarak yer tutucular. İşlem bittikten sonra Future
irade bu sonucu içerecektir. Örneğin, bir işlem ExecutorService'e gönderilen Runnable veya Callable örneği olabilir . İşlemin göndericisi nesneyi işlemin Bitti () olup olmadığını kontrol etmek için kullanabilir veya engelleme get () yöntemini kullanarak tamamlanmasını bekleyebilir .Future
Misal:
/**
* A task that sleeps for a second, then returns 1
**/
public static class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
Thread.sleep(1000);
return 1;
}
}
public static void main(String[] args) throws Exception{
ExecutorService exec = Executors.newSingleThreadExecutor();
Future<Integer> f = exec.submit(new MyCallable());
System.out.println(f.isDone()); //False
System.out.println(f.get()); //Waits until the task is done, then prints 1
}
CompletableFutures
CompletableFutures , Java 8'de (2014) tanıtıldı. Bunlar aslında Google'ın esinlenerek düzenli Vadeli bir evrim vardır Listenable Futures parçası Guava kütüphanesinin bir . Bunlar aynı zamanda bir zincirde görevleri bir araya getirmenize izin veren Futures'lardır. Bunları, bir işçi iş parçacığına "gidip X görevini yapın ve işiniz bittiğinde X'in sonucunu kullanarak başka bir şey yapın" demesini söylemek için kullanabilirsiniz. CompletableFutures kullanarak, sonucu beklemek için bir iş parçacığını gerçekten engellemeden işlemin sonucuyla ilgili bir şeyler yapabilirsiniz. İşte basit bir örnek:
/**
* A supplier that sleeps for a second, and then returns one
**/
public static class MySupplier implements Supplier<Integer> {
@Override
public Integer get() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//Do nothing
}
return 1;
}
}
/**
* A (pure) function that adds one to a given Integer
**/
public static class PlusOne implements Function<Integer, Integer> {
@Override
public Integer apply(Integer x) {
return x + 1;
}
}
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newSingleThreadExecutor();
CompletableFuture<Integer> f = CompletableFuture.supplyAsync(new MySupplier(), exec);
System.out.println(f.isDone()); // False
CompletableFuture<Integer> f2 = f.thenApply(new PlusOne());
System.out.println(f2.get()); // Waits until the "calculation" is done, then prints 2
}
RxJava
RxJava reaktif programlama için bütün bir kütüphanedir Netflix'te oluşturulan . Bir bakışta, Java 8'in akışlarına benzer görünecek . Çok daha güçlü olması dışında.
Futures'a benzer şekilde, RxJava, bir işleme hattı oluşturmak için bir grup senkronize veya senkronize olmayan eylemi bir araya getirmek için kullanılabilir. Tek kullanımlık Futures'tan farklı olarak, RxJava sıfır veya daha fazla öğenin akışı üzerinde çalışır . Sonsuz sayıda öğe içeren bitmeyen akışlar dahil. İnanılmaz derecede zengin olması sayesinde çok daha esnek ve güçlü operatörler .
Java 8'in akışları farklı olarak, RxJava de vardır backpressure , işleme boru hattınızın farklı bölümlerinin farklı iş parçacıklarında farklı hızlarda çalıştığı durumları işlemesine izin veren mekanizmasına .
RxJava'nın dezavantajı, sağlam belgelere rağmen, ilgili paradigma kayması nedeniyle öğrenmenin zor bir kütüphane olmasıdır. Rx kodu, özellikle birden fazla iş parçacığı varsa ve daha da kötüsü - geri basınç gerekiyorsa, hata ayıklamak için bir kabus olabilir.
Buna girmek istiyorsanız, resmi web sitesinde çeşitli eğitimlerin yanı sıra resmi belgeler ve Javadoc'un bir sayfası var . Ayrıca , Rx'e kısa bir giriş yapan ve ayrıca Rx ve Futures arasındaki farkları anlatan bu gibi videolara da göz atabilirsiniz .
Bonus: Java 9 Reaktif Akışları
Java 9'un Reaktif Akışları aka Flow API'si RxJava 2 , Akka Akışları ve Vertx gibi çeşitli reaktif akış kütüphaneleri tarafından uygulanan bir Arabirimler kümesidir . Tüm önemli geri basıncı korurken, bu reaktif kütüphanelerin birbirine bağlanmasına izin verirler.