в Java , Бъдеще е интерфейс който принадлежи на java.util.concurrent пакет . Използва се за представяне на резултата от асинхронно изчисление. Интерфейсът предоставя методите за проверка дали изчислението е завършено или не, за изчакване за завършването му и за извличане на резултата от изчислението. След като задачата или изчислението са завършени, изчислението не може да бъде отменено.
Синтаксис:
public interface Future
Пример за бъдещето на Java
Най-добрият пример за Java Future е ExecutorService интерфейс. Той създава обект Future (от някои от техните методи) за проследяване на напредъка на една или повече асинхронни задачи.
Методи на бъдещия интерфейс
Интерфейсът предоставя следните пет метода:
Метод | Описание |
---|---|
отмени () | Опитва се да отмени изпълнението на задачата. |
получи() | Методът изчаква, ако е необходимо, изчислението да завърши и след това извлича резултата. |
получи() | Изчаква, ако е необходимо, най-много даденото време за завършване на изчислението и след това извлича резултата, ако е наличен. |
isCancelled() | Връща true, ако задачата е била отменена преди нейното завършване. |
готово е() | Връща true, ако задачата е изпълнена. |
Имаше някои недостатъци на интерфейса Future, които са както следва:
- Използвайки Future, изчислението не може да бъде завършено ръчно.
- Той не уведомява, след като комутацията е завършена.
- Неговата верига не може да бъде създадена и комбинирана.
За да преодолеете горните ограничения, Java 8 въведени CompletableFuture .
Използване на Future в асинхронно програмиране
Получаване на резултат
Както обсъдихме по-горе, бъдещето представлява резултат от асинхронна задача. За да извлече резултата от тази асинхронна задача, интерфейсът на 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(); } }
Изход: