Работаем с CompletableFuture
Накидал маленький пример работы с CompletableFuture
package ru.yamakarov.concurrent;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture<String> completableFuture = new CompletableFuture<>();
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.submit(() -> {
try {
Thread.sleep(1000);
completableFuture.complete("Done");
} catch (InterruptedException e) {
completableFuture.completeExceptionally(e);
}
});
try {
System.out.println(completableFuture.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
C его помощью можно передавать информацию асинхронно между потоками исполнения.
В примере выше создается обещание выдать строку и запускается таск в сервисе выполнения.
В потоке выполняющем работу через некоторое время появляется результат, а поток ждущий исполнения получает его по появлению.
Это достаточно высокоуровневая абстракция, обходящаяся без локов и wait, notify
.