ฟิวเจอร์ส
ฟิวเจอร์ถูกนำมาใช้ใน Java 5 (2004) โดยทั่วไปแล้วจะเป็นตัวแทนสำหรับผลลัพธ์ของการดำเนินการที่ยังไม่เสร็จ เมื่อการดำเนินการเสร็จสิ้นFuture
จะมีผลลัพธ์นั้น ยกตัวอย่างเช่นการดำเนินการอาจจะเป็นRunnableหรือCallableอินสแตนซ์ที่จะถูกส่งไปยังExecutorService ผู้ส่งของการดำเนินการสามารถใช้Future
วัตถุที่จะตรวจสอบว่าการดำเนินการisDone ()หรือรอให้เสร็จสิ้นการใช้บล็อกได้รับ ()วิธีการ
ตัวอย่าง:
/**
* 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 (2014) อันที่จริงแล้วมันเป็นวิวัฒนาการของฟิวเจอร์สปกติซึ่งได้รับแรงบันดาลใจจากListenable Futuresของ Google ซึ่งเป็นส่วนหนึ่งของห้องสมุดGuava พวกเขาเป็นฟิวเจอร์สที่ช่วยให้คุณสามารถรวมภารกิจเข้าด้วยกันในห่วงโซ่ คุณสามารถใช้มันเพื่อบอกเธรดผู้ปฏิบัติงานเพื่อ "ทำงานบางอย่าง X และเมื่อเสร็จแล้วให้ทำสิ่งอื่นโดยใช้ผลลัพธ์ของ X" การใช้ CompletableFutures คุณสามารถทำบางสิ่งกับผลลัพธ์ของการดำเนินการได้โดยไม่ต้องบล็อกเธรดเพื่อรอผลลัพธ์ นี่คือตัวอย่างง่ายๆ:
/**
* 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เป็นห้องสมุดทั้งหมดสำหรับการเขียนโปรแกรมเชิงโต้ตอบที่สร้างขึ้นที่ Netflix ได้อย่างรวดเร็วก็จะปรากฏจะคล้ายกับลำธาร Java 8 มันยกเว้นว่ามันจะมีประสิทธิภาพมากกว่า
ในทำนองเดียวกันกับฟิวเจอร์ส RxJava สามารถใช้เพื่อรวมสตริงของการกระทำแบบซิงโครนัสหรือแบบอะซิงโครนัสเข้าด้วยกันเพื่อสร้างขั้นตอนการประมวลผล ต่างจาก Futures ซึ่งเป็นแบบใช้ครั้งเดียว RxJava ทำงานบนสตรีมของรายการที่เป็นศูนย์หรือมากกว่า การรวมสตรีมที่ไม่มีที่สิ้นสุดด้วยจำนวนรายการที่ไม่สิ้นสุด นอกจากนี้ยังขอบคุณที่มีความยืดหยุ่นมากขึ้นและมีประสิทธิภาพในการอุดมไปด้วยอย่างไม่น่าเชื่อการตั้งค่าของผู้ประกอบการ
ซึ่งแตกต่างจากลำธาร Java 8, RxJava ยังมีbackpressureกลไกที่ช่วยให้สามารถจัดการกับกรณีที่ชิ้นส่วนที่แตกต่างกันของท่อประมวลผลการดำเนินงานในหัวข้อที่แตกต่างกันในอัตราที่แตกต่างกัน
ข้อเสียของ RxJava คือแม้จะมีเอกสารที่เป็นของแข็ง แต่ก็เป็นห้องสมุดที่ท้าทายในการเรียนรู้เนื่องจากการเปลี่ยนกระบวนทัศน์ที่เกี่ยวข้อง รหัส Rx อาจเป็นฝันร้ายสำหรับการดีบักโดยเฉพาะหากมีหลายเธรดที่เกี่ยวข้อง
หากคุณต้องการที่จะได้รับในนั้นมีทั้งหน้าของบทเรียนต่างๆในเว็บไซต์อย่างเป็นทางการรวมทั้งอย่างเป็นทางการเอกสารและJavadoc นอกจากนี้คุณยังสามารถดูวิดีโอบางส่วนเช่นวิดีโอนี้ซึ่งให้คำแนะนำสั้น ๆ เกี่ยวกับ Rx และพูดคุยเกี่ยวกับความแตกต่างระหว่าง Rx และฟิวเจอร์ส
โบนัส: Java 9 Reactive Streams
Java 9 ปฏิกิริยา Streams aka ไหล APIเป็นชุดของการเชื่อมต่อต่างๆที่ดำเนินการโดยปฏิกิริยาลำธารห้องสมุดเช่นRxJava 2 , Akka ลำธารและVertx พวกเขาอนุญาตให้ไลบรารีปฏิกิริยาเหล่านี้เชื่อมต่อระหว่างกันในขณะที่รักษาแรงกดดันด้านหลังที่สำคัญทั้งหมดไว้