선물
선물 은 Java 5 (2004)에 도입되었습니다. 기본적으로 아직 완료되지 않은 작업의 결과에 대한 자리 표시 자입니다. 작업이 완료되면에 Future
해당 결과가 포함됩니다. 예를 들어 작업은 ExecutorService에 제출 된 Runnable 또는 Callable 인스턴스 일 수 있습니다 . 오퍼레이션 제출자는 오브젝트를 사용하여 오퍼레이션이 isDone () 인지 여부를 확인 하거나 블로킹 get () 메소드를 사용하여 완료 될 때까지 기다릴 수 있습니다.Future
예:
/**
* 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)에 도입되었습니다. 그것들은 사실 구아바 도서관의 일부인 구글의 리스너 러블 퓨처스 ( Google의 Listenable Futures) 에서 영감을 얻은 정기 선물의 진화입니다 . 그것들은 또한 당신이 체인으로 작업을 묶을 수있는 선물입니다. 그것들을 사용하여 일부 작업자 스레드에게 "일부 작업 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 는 0 개 이상의 항목 스트림 에서 작동 합니다. 무한한 수의 항목으로 끝나지 않는 스트림 포함. 믿을 수 없을만큼 풍부한 연산자 세트 덕분에 훨씬 유연하고 강력 합니다.
Java 8의 스트림과 달리 RxJava에는 역압 메커니즘이있어 처리 파이프 라인의 다른 부분이 다른 스레드 에서 다른 속도로 작동하는 경우를 처리 할 수 있습니다 .
RxJava의 단점은 탄탄한 문서에도 불구하고 관련된 패러다임 전환으로 인해 배우기 어려운 라이브러리라는 것입니다. Rx 코드는 특히 여러 스레드가 관련되어 있고 더 심한 경우 역압이 필요한 경우 디버깅하기에 악몽이 될 수 있습니다.
그것에 들어가고 싶다면 공식 웹 사이트와 공식 문서 및 Javadoc 에 대한 다양한 자습서 의 전체 페이지 가 있습니다. Rx에 대한 간략한 소개를 제공하고 Rx와 미래의 차이점에 대해 이야기하는 이 비디오와 같은 일부 비디오를 살펴볼 수도 있습니다 .
보너스 : Java 9 반응성 스트림
Java 9의 Reactive Streams 일명 Flow API 는 RxJava 2 , Akka Streams 및 Vertx 와 같은 다양한 반응성 스트림 라이브러리로 구현되는 인터페이스 세트입니다 . 이것들은 모든 반응성 배압을 유지하면서 이러한 반응성 라이브러리가 상호 연결되도록합니다.