Ce este o interfață Java catalabilă? Această interfață este legată semnificativ la programarea concurentă. Când cineva începe să lucreze în Java, apare rapid clasa firului care ne permite să rulam sarcini concurente. Cu toate acestea, aveți unele limitări, să vedem un exemplu:
package com.arquitecturajava;public class Tarea implements Runnable {@Overridepublic void run() {int total = 0;for(int i=0;i<5;i++) {total+=i;try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println(Thread.currentThread().getName());System.out.println(total);}}
Tocmai am creat o sarcină care implementează interfața runnabilă. Putem de la ea pentru a crea un fir sau fir care o execută și ne imprimă pe ecran suma primilor 5 termeni după 1500 milisecunde (bucla ITERA de 5 ori).
package com.arquitecturajava;public class PrincipalHilo {public static void main(String args) {Tarea t= new Tarea();Thread hilo= new Thread(t);hilo.start();}}
Rezultatul pe care îl vedem că acesta apare prin consola:
Totul a funcționat corect. Problema este că suntem forțați să imprimăm datele de către consolă. Metoda de alergare a interfeței runnabile nu returnează nimic.
Interfață Java Scuilabilă
Majoritatea ocaziilor avem nevoie de o sarcină paralelă de executat și apoi va fi returnat un rezultat. Cum putem face asta? . Java prevede aceste situații ale interfeței apelabile, să o vedem.
package com.arquitecturajava;import java.util.concurrent.Callable;public class MiCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int total = 0;for(int i=0;i<5;i++) {total+=i;try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println(Thread.currentThread().getName());return total;}}
În acest caz găsim ceva foarte asemănător, dar folosim interfața apelabilă. Această interfață are metoda de apel care este capabilă să ne returneze un rezultat că metoda de alergare nu permite.
Publicul gol ();
Public T Apel ();
Am creat doar o clasă care a implementat interfața Java selectată. Este timpul să îl folosiți dintr-o metodă principală.
package com.arquitecturajava;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class PrincipalCallable {public static void main(String args) {try {ExecutorService servicio= Executors.newFixedThreadPool(1);Future<Integer> resultado= servicio.submit(new MiCallable());if(resultado.isDone()) {System.out.println(resultado.get()); }} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ExecutionException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
În acest caz am folosit executanService pentru a crea o piscină cu fir cu un singur fir și trimite sarcina la piscină folosind metoda Trimitere.