в Java , майбутнє є інтерфейс що належить java.util.concurrent пакет . Він використовується для представлення результату асинхронного обчислення. Інтерфейс надає методи перевірки завершення обчислення чи ні, очікування його завершення та отримання результату обчислення. Після завершення завдання або обчислення неможливо скасувати обчислення.
Синтаксис:
public interface Future
Приклад Java Future
Найкращим прикладом Java Future є ВиконавецьСервіс інтерфейс. Він створює об’єкт Future (з деяких їхніх методів) для відстеження прогресу одного чи кількох асинхронних завдань.
Методи майбутнього інтерфейсу
Інтерфейс надає такі п’ять методів:
метод | опис |
---|---|
скасувати() | Він намагається скасувати виконання завдання. |
отримати() | Метод чекає, якщо необхідно, поки обчислення завершиться, а потім отримує його результат. |
отримати() | За потреби чекає не більше заданого часу для завершення обчислення, а потім отримує його результат, якщо він доступний. |
isCancelled() | Він повертає true, якщо завдання було скасовано до його завершення. |
зроблено() | Він повертає true, якщо завдання виконано. |
В інтерфейсі Future були такі недоліки:
- Використовуючи Future, обчислення не можна завершити вручну.
- Він не повідомляє про завершення комутації.
- Його ланцюжок неможливо створити і об'єднати.
Щоб подолати зазначені вище обмеження, Java 8 введено CompletableFuture .
Використання майбутнього в асинхронному програмуванні
Отримання результату
Як ми обговорювали вище, Майбутнє являє собою результат асинхронного завдання. Щоб отримати результат цього асинхронного завдання, інтерфейс Java Future надає наступні дві версії методів get(), обидва повертають об’єкт. Зауважте, що тип повернення може бути загальним типом. Наприклад:
Future future = ... // get Future by starting async task // do something else, until ready to check result via Future // get result from Future try { Object result = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }
Примітка. Якщо ми спробуємо викликати метод get() до завершення асинхронного завдання, метод get() блокуватиметься, доки не буде готовий результат.
Щоб подолати вищевказаний недолік, інтерфейс Future надає іншу версію методу get(), яка виключає кількість час (у мілісекундах) як параметр. Це означає, що Майбутнє чекатиме деякий час для виконання завдання після того, як цей результат буде доступним у Майбутньому. Наприклад:
try { Object result = future.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { } catch (ExecutionException e) { } catch (TimeoutException e) { // thrown if timeout time interval passes // before a result is available. }
Якщо Future не отримує жодного результату протягом зазначеного часу, a TimeoutException кидається Майбутнім.
Скасування асинхронного завдання
Ми також можемо скасувати асинхронне завдання в будь-який момент, викликавши скасувати() метод інтерфейсу Future. Наприклад:
Future future = ... // Get Future from somewhere future.cancel();
Перевірте, чи виконано асинхронне завдання
Інтерфейс надає метод зроблено() щоб перевірити, чи виконано асинхронне завдання чи ні. Наприклад:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
Перевірте, чи асинхронне завдання скасовано
Інтерфейс Future надає метод isCancelled() щоб перевірити, чи асинхронне завдання, представлене Future, скасовано чи ні. Він повертає true, якщо завдання успішно скасовано, інакше повертає false. Наприклад:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Приклад Java Future
FutureExample.java
import java.util.concurrent.*; public class FutureExample { public static void main(String args[]) throws InterruptedException, ExecutionException { //ExecutorService allows us to execute tasks on threads asynchronously ExecutorService es = Executors.newSingleThreadExecutor(); //getting future //the method submit() submits a value-returning task for execution and returns the Future Future future = es.submit(() -> { //sleep thread for 2 seconds Thread.sleep(2000); return 'Welcome to Javatpoint'; }); //checks if the task is completed or not while(!future.isDone()) { System.out.println('The task is still in process.....'); //sleep thread for 2 milliseconds Thread.sleep(200); } System.out.println('Task completed! getting the result'); //getting the result after completing the task String result = future.get(); //prints the result System.out.println(result); es.shutdown(); } }
Вихід: