Java Callable Future Example
unul dintre beneficiile Java executor framework este că putem rula sarcini concurente care pot returna un singur rezultat după procesarea sarcinilor. API-ul de concurență Java realizează acest lucru cu următoarele două interfețe Callable
și Future
.
interfețe java apelabile și viitoare
1.1. Callable
Callable
interfața are metoda call()
. În această metodă, trebuie să implementăm logica unei sarcini. Interfața Callable
este o interfață parametrizată, ceea ce înseamnă că trebuie să indicăm tipul de date pe care metoda call()
o va returna.
2.2. Interfața viitoare
Future
are metode pentru a obține rezultatul generat de un obiect Callable
și pentru a gestiona starea acestuia.
Java exemplu viitor nevărsat
în acest exemplu, vom crea un FactorialCalculator
care este de tip Callable
. Înseamnă că vom trece peste metoda call()
și după calcul, vom returna rezultatul din metoda call()
. Acest rezultat mai târziu pot fi preluate de la Future
referință deținute de programul principal.
acum să testăm calculatorul factorial de mai sus folosind două fire și 4 numere.
ieșire Program.
aici am trimis un obiect Callable
pentru a fi executat într-un executor folosind metoda submit()
. Această metodă primește un obiect Callable
ca parametru și returnează un obiect Future
pe care îl putem folosi cu două obiective principale–
- putem controla starea sarcinii – putem anula sarcina și putem verifica dacă s-a terminat. În acest scop, am folosit metoda
isDone()
pentru a verifica dacă sarcinile s-au terminat. - putem obține rezultatul returnat prin metoda call (). În acest scop, am folosit metoda
get()
. Această metodă așteaptă până când obiectulCallable
a terminat executarea metodeicall()
și și-a returnat rezultatul.dacă firul este întrerupt în timp ce metoda
get()
așteaptă rezultatul, acesta aruncă o excepțieInterruptedException
. Dacă metodacall()
aruncă o excepție, această metodă aruncă o excepțieExecutionException
.
interfața Future
oferă o altă versiune a metodei get()
, adică get (longtimeout,TimeUnitunit). Această versiune a metodei get, dacă rezultatul sarcinii nu este disponibil, îl așteaptă pentru timpul specificat. Dacă perioada de timp specificată trece și rezultatul nu este încă disponibil, metoda returnează o valoare null
.
Învățare Fericită !!