Я выяснил, что по умолчанию они запускаются в однопоточном цикле событий, и, похоже, нет способа указать собственный цикл событий (экземпляр Vertx) на будущее
код> для запуска. В своих библиотеках (например, клиенте postgresql) они используют свой внутренний API:
Код: Выделить всё
ContextInternal current = vertx.getOrCreateContext();
if (pipelined) {
return current.failedFuture("Cannot acquire a connection on a pipelined pool");
}
Promise promise = current.promise();
Код: Выделить всё
package com.example;
import io.vertx.core.*;
import io.vertx.core.impl.ContextInternal;
public class FuturesTest {
static Vertx vertx = Vertx.vertx();
public static long fib(int n) {
long a = 0, b = 1;
for (int i = 1; i < n; i++) {
var x = a;
a = b;
b = x + b;
}
return b;
}
public static Future runTask(String m) {
return Future.future(p -> {
System.out.println("running " + m);
p.complete();
}).map(p -> {
System.out.println("30th fibonacci num is " + fib(30)); //Calling a method that calculates the nth fibonacci
return null;
}).map(p -> {
System.out.println("completed running " + m);
return null;
}).onComplete(p -> System.out.println(m + " completed"));
}
public static void main(String[] args) throws Exception {
var f1 = runTask("Future one");
var f2 = runTask("Future two");
var ff = Future.any(f1, f2).onComplete(ar ->{
if(ar.succeeded()){
System.out.println("All succeeded");
} else {
System.out.println("At least one failed");
}
});
Thread.sleep(5000);
System.out.println("EXIT");
}
}
Я пытаюсь добиться этого исключительно с помощью Futures, избегая выполнения ExecutBlocking() или подобных методов, но я не нашел способа изменить цикл событий по умолчанию для использования нескольких потоков. Я не хочу создавать несколько циклов событий, как в этом вопросе, но хочу, чтобы Future запускался в нескольких потоках.
Подробнее здесь: https://stackoverflow.com/questions/787 ... ncurrently
Мобильная версия