Ин Јава , Будућност је интерфејс који припада јава.утил.цонцуррент пакет . Користи се за представљање резултата асинхроног израчунавања. Интерфејс пружа методе за проверу да ли је израчунавање завршено или не, да се сачека његов завршетак и да се поврати резултат израчунавања. Када се задатак или прорачун заврши, не може се поништити израчунавање.
Синтакса:
public interface Future
Пример Јава будућности
Најбољи пример Јава Футуре је ЕкецуторСервице интерфејс. Он производи Футуре (из неких њихових метода) објекат за праћење напретка једног или више асинхроних задатака.
Методе будућег интерфејса
Интерфејс пружа следећих пет метода:
Метод | Опис |
---|---|
поништити, отказати() | Покушава да откаже извршење задатка. |
добити() | Метода чека ако је потребно да се израчунавање заврши, а затим преузима свој резултат. |
добити() | Чека ако је потребно, највише дато време да се израчунавање заврши, а затим преузима његов резултат, ако је доступан. |
исЦанцеллед() | Враћа тачно ако је задатак отказан пре његовог завршетка. |
исДоне() | Враћа тачно ако је задатак завршен. |
Постојали су неки недостаци Футуре интерфејса који су следећи:
- Користећи Футуре, прорачун се не може завршити ручно.
- Не обавештава када је комутација завршена.
- Његов ланац се не може створити и комбиновати.
Да би се превазишла горе наведена ограничења, Јава 8 представио ЦомплетаблеФутуре .
Коришћење будућности у асинхроном програмирању
Геттинг Ресулт
Као што смо већ рекли, будућност представља резултат асинхроног задатка. Да би се добио резултат тог асинхроног задатка, Јава Футуре интерфејс пружа следеће две верзије метода гет() које обе враћају објекат. Имајте на уму да тип враћања може бити генерички тип. На пример:
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(); }
Напомена: Ако покушамо да позовемо метод гет() пре него што се асинхрони задатак заврши, метода гет() ће се блокирати док резултат не буде спреман.
Да би се превазишао горе наведени недостатак, Футуре интерфејс обезбеђује још једну верзију гет() методе која осим количине време (у милисекундама) као параметар. То представља да ће будућност чекати одређено време да заврши задатак након што тај резултат буде доступан у будућности. На пример:
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 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 future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Пример Јава будућности
ФутуреЕкампле.јава
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(); } }
Излаз: