Wednesday, September 16, 2015

MANEJO 'THREADs' CON RETORNO.

Muchas veces en JAVA, cuando requerimos utilizar 'Threads' para realizar flujos paralelos entre otros casos, nos vemos con la problemática de como obtener el valor de 'return' que el método 'run()' procesa. En esta oportunidad mostraré una forma fácil de como obtener dicho valor de retorno (sea cual sea el objeto). Los pasos son los siguientes:

Creamos la clase 'Usuario.java' que será el bean que procesaremos y parsearemos a nivel de los Threads.
   
    class Usuario{
         
          private String codigo;
          private String nombres;
          private String telefono;
         
          public Usuario( String codigo, String nombres,
String telefono ){
                 this.codigo   = codigo;
                 this.nombres  = nombres;
                 this.telefono = telefono;
          }
         
          public String getCodigo(){
                 return codigo;
          }
          public void setCodigo( String codigo ){
                 this.codigo = codigo;
          }
          public String getNombres(){
                 return nombres;
          }
          public void setNombres( String nombres ){
                 this.nombres = nombres;
          }
          public String getTelefono(){
                 return telefono;
          }
          public void setTelefono( String telefono ){
                 this.telefono = telefono;
          }
    }


Creamos la clase 'MensajeThread01.java' y 'MensajeThread02.java' que serán las clases que procesarán la lógica propia del negocio y que retornarán el objeto ya parseado por medio del método 'call()'. Así mismo, lo reslatado en ROJO, son los clases que pueden variar en base a los datos deseados para el retorno.

class MensajeThread01 implements Callable<Usuario>{
 
        public
Usuario call(){

            Usuario vRespuesta = null;
           
            try{
                //-------------- [logica a procesar en hilos] --------------//
                Thread.sleep(2 * 1000);               
                vRespuesta = new
Usuario( "2", "MIGUEL LEIVA", "98657852" );
                //-------------- [logica a procesar en hilos] --------------//
            }
            catch( final InterruptedException e ){
                   e.printStackTrace();
            }   
            return vRespuesta;
        }   
    }


    class MensajeThread02 implements Callable<Usuario>{
   
        public
Usuario call(){

            Usuario vRespuesta = null;
           
            try{
                //-------------- [logica a procesar en hilos] --------------//
                Thread.sleep(3 * 1000);               
                vRespuesta = new Usuario( "1", "CESAR GUERRA", "98754852" );
                //-------------- [logica a procesar en hilos] --------------//
            }
            catch( final InterruptedException e ){
                   e.printStackTrace();
            }   
            return vRespuesta;
        }   
    }


Creamos el método 'procesarLogica' se encargará de lanzar las diferentes instancias de hilos. Así mismo, lo reslatado en ROJO, son los clases que pueden variar en base a los datos deseados para el retorno.

        public static void main( final String[] argumentos ){          
               TestThreadReturned x = new TestThreadReturned();
               x.procesarLogica();
        }


        public void procesarLogica(){
               System.out.println( "--------- [procesarLogica] - [INICIO] ---------" );
             
               final ExecutorService objServicio_01;
               final ExecutorService objServicio_02;
             
               final Future<
Usuario> objTarea_01;
               final Future<Usuario> objTarea_02;
             
               objServicio_01 = Executors.newFixedThreadPool( 1 );      
               objServicio_02 = Executors.newFixedThreadPool( 1 );
             
               objTarea_01 = objServicio_01.submit( new MensajeThread01() );
               objTarea_02 = objServicio_02.submit( new MensajeThread02() );
             
               try{
                   final
Usuario objRespuesta_01 = objTarea_01.get();
                   System.out.println( "- Codigo: ["   + objRespuesta_01.getCodigo()   + "]" );
                   System.out.println( "- Nombres: ["  + objRespuesta_01.getNombres()  + "]" );
                   System.out.println( "- Telefono: [" + objRespuesta_01.getTelefono() + "]" );
                   System.out.println( "" );
                 
                   final
Usuario objRespuesta_02 = objTarea_02.get();
                   System.out.println( "- Codigo: ["   + objRespuesta_02.getCodigo()   + "]" );
                   System.out.println( "- Nombres: ["  + objRespuesta_02.getNombres()  + "]" );
                   System.out.println( "- Telefono: [" + objRespuesta_02.getTelefono() + "]" );
               }
               catch( final InterruptedException e ){
                      e.printStackTrace();
               }
               catch( final ExecutionException e ){
                      e.printStackTrace();
               }
               finally{          
                          objServicio_01.shutdownNow();
                          System.out.println( "--------- [procesarLogica] - [FIN] ---------" );
               }
         }              
    }

   
Para descarga la clase completa pulsar aquí: http://www.mediafire.com/download/97yy0w0oa70pmet/TestThreadReturned.java