Per a què serveix un Java callable interfície ?. Aquest interfície aquesta lligat de forma important a la programació concurrent. Quan un comença a treballar en Java, ràpidament apareix la classe Thread que ens permet executar tasques concurrents .No obstant això té algunes limitacions, anem a veure un exemple:
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);}}
acabem de crear una tasca que implementa la interfície runnable. Podem a partir d’ella crear un Thread o fil que l’executi i ens imprimeixi per pantalla la suma dels primers 5 termes després de 1500 mil·lisegons (el bucle itera 5 vegades).
package com.arquitecturajava;public class PrincipalHilo {public static void main(String args) {Tarea t= new Tarea();Thread hilo= new Thread(t);hilo.start();}}
El resultat el veiem aparèixer per la consola:
Tot ha funcionat correctament. El problema és que ens veiem obligats a imprimir les dades per la consola. El mètode run de la interfície runnable no torna res.
Java callable Interface
En la major part de les ocasions necessitem que s’executi una tasca en paral·lel i després en el futur ens torni un resultat. Com podem fer això? . Java proveeix per a aquestes situacions de la interfície callable, anem a veure-ho.
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;}}
En aquest cas ens trobem amb una cosa molt similar però fem servir la interfície callable. Aquest interfície disposa de mètode call que és capaç de retornar un resultat una mica que el mètode run no permet.
public void run ();
public T call ();
Acabem de crear una classe que implementi Java callable interfície. És moment d’usar-la des d’un mètode main.
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();}}}
En aquest cas hem fet servir ExecutorService per crear un pool d’Thread amb un únic fil i enviar la tasca a l’pool utilitzant el mètode submit.
Quan invoquem el servei rebrem de forma automàtica una variable de tipus Future la qual rebrà en un futur valor a el qual 10 que va podrem imprimir usant el mètode get ().
El resultat a la consola és semblant, l’única diferència és que fem servir un pool de Threads.
Hem rebut dades de retorn d’una tasca que s’executa en paral·lel
Altres articles relacionats: Java Executor Service i Threading, Java wait notify i threads , JavaScript Promise i la programació asíncrona