Объект Java Future используется для получения результата асинхронного вычисления, выполняемого параллельным потоком (исполнителями). Мы называем метод Future.get() и ожидаем, пока результат не будет готов. В этом примере показан неблокирующий способ получения результата из Future. java-implement-java-non-blocking-futures.Как реализовать неблокирующие фьючерсы в Java
NonBlockingExecutor executor = new NonBlockingExecutor(Executors.newSingleThreadExecutor());
NonBlockingFuture<Integer> future = executor.submitNonBlocking(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
//print -> pool-1-thread-1
return 1;
}
});
future.setHandler(new FutureHandler<Integer>() {
@Override
public void onSuccess(Integer value) {
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
//print -> pool-1-thread-1
}
@Override
public void onFailure(Throwable e) {
System.out.println(e.getMessage());
}
});
Thread.sleep(50000);
В этом методе onSuccess() вызывается после завершения параллельного выполнения. Проблема заключается в том, что метод onSuccess() не работает в основном потоке. Я хочу выполнить метод onSuccess() в основном потоке. Как я могу это исправить. Спасибо
Предположительно, ваш основной поток занят чем-то другим. –
Честно говоря, я не знаю, как это сделать с исполнителями. Сбой во всем остальном, вы всегда можете «взломать» его в виду - просто передайте некоторые данные в коллекцию, затем основной поток видит данные в этой коллекции и отвечает соответствующим образом. – KookieMonster
Можем ли мы это сделать, используя Java 8 CompletableFuture? – Tharanga