Ваш первый пример неправильного использования Future
.Вызов executeLongRunningBlockingOperation()
блокирует основной поток до тех пор, пока этот метод не завершится - т.е. больше ничего не может произойти, пока операция блокировки не завершится.Во втором примере блокирующий вызов выполняется в фоновом потоке, и во время его выполнения продолжают происходить другие вещи.
Чтобы проиллюстрировать это на более полном примере, этот код:
public void executeLongRunningBlockingOperation() {
Thread.sleep(5000);
}
public Future<Void> doTheJob() {
System.out.println("Doing the job...");
Future<Void> future = Future.future();
executeLongRunningBlockingOperation();
// this line will not be called until executeLongRunningBlockingOperation returns!
future.complete();
// nor will this method! This means that the method won't return until the long operation is done!
return future;
}
public static void main(String[] args) {
doTheJob().setHandler(asyncResult -> {
System.out.println("Finished the job");
});
System.out.println("Doing other stuff in the mean time...");
}
Создает следующий вывод:
Doing the job...
Finished the job
Doing other stuff in the mean time...
Принимая во внимание, что этот код (с использованием executeBlocking):
...
public Future<Void> doTheJob() {
System.out.println("Doing the job...");
Future<Void> future = Future.future();
Vertx vertx = Vertx.vertx();
vertx.executeBlocking(call -> {
executeLongRunningBlockingOperation();
call.complete;
}, result -> {
// this will only be called once the blocking operation is done
future.complete();
});
// this method returns immediately since we are not blocking the main thread
return future;
}
...
выдаст:
Doing the job...
Doing other stuff in the mean time...
Finished the job
Если выхотел бы лучше понять Vert.x Я бы порекомендовал следующие практические руководства:
https://vertx.io/docs/guide-for-java-devs/
http://escoffier.me/vertx-hol/