Está en la página 1de 4

En Java para utilizar la multitarea debemos de usar la clase Thread (es decir que la clase que implementemos debe

heredar de la clase Thread) y la clase Thread


implementalaInterfaceRunnable.EnelsiguientediagramadeclasemostramoslaInterfaceRunnableylaclaseThreadconsusprincipalesmtodos:

EnestaentradanovamosavercomoutilizartodoslosmtodosdelaclaseThread,perooslosmostramosparaquesepisqueexistenyaparteporsunombrepodis
intuirsufuncionalidad.
Enestaentradavamosaponerunejemploparaqueveislasventajasdelamultitarea,viendocomoseejecutaraunprogramasinutilizarlamultitareayotroutilizndola.
En este ejemplo vamos a simular el proceso de cobro de un supermercado es decir, unos clientes van con un carro lleno de productos y una cajera les cobra los
productos,pasndolosunoaunoporelescanerdelacajaregistradora.Enestecasolacajeradebedeprocesarlacompraclienteacliente,esdecirqueprimerolecobraal
cliente1,luegoalcliente2yassucesivamente.ParaellovamosadefinirunaclaseCajerayunaclaseClienteelcualtendrunarraydeenterosquerepresentaran
losproductosquehacompradoyeltiempoquelacajeratardarenpasarelproductoporelescaneresdecir,quesitenemosunarraycon[1,3,5]significarqueelcliente
hacomprado3productosyquelacajeratardaraenprocesarelproducto11segundo,elproducto23segundosyelproducto3en5segundos,conlocualtardaraen
cobraralclientetodasucompra9segundos.
Explicadoesteejemplovamosavercomohemosdefinidoestasclases:
ClaseCajera.java:
publicclassCajera{

privateStringnombre;

//Constructor,getterysetter

publicvoidprocesarCompra(Clientecliente,longtimeStamp){

System.out.println("Lacajera"+this.nombre+

"COMIENZAAPROCESARLACOMPRADELCLIENTE"+cliente.getNombre()+

"ENELTIEMPO:"+(System.currentTimeMillis()timeStamp)/1000

"seg");

for(inti=0;i<cliente.getCarroCompra().length;i++){

this.esperarXsegundos(cliente.getCarroCompra()[i]);

System.out.println("Procesadoelproducto"+(i+1)+

">Tiempo:"+(System.currentTimeMillis()timeStamp)/1000+

"seg");

System.out.println("Lacajera"+this.nombre+"HATERMINADODEPROCESAR"+

cliente.getNombre()+"ENELTIEMPO:"+

(System.currentTimeMillis()timeStamp)/1000+"seg");

privatevoidesperarXsegundos(intsegundos){

try{

Thread.sleep(segundos*1000);

}catch(InterruptedExceptionex){

Thread.currentThread().interrupt();

}
}

ClaseCliente.java:
publicclassCliente{

privateStringnombre;
privateint[]carroCompra;

//Constructor,getterysetter

SiejecutsemosesteprogramapropuestocondosClientesyconunsoloproceso(queesloquesesuelehacernormalmente),seprocesaraprimerolacompradelCliente
1ydespusladelCliente2,conlocualsetardareltiempodelCliente1+Cliente2.AcontinuacinvamosavercomoprogramamoselmtodoMainparalanzarel
programa.CUIDADO:AunquehayamospuestodosobjetosdelaclaseCajera(cajera1ycajera2)nosignificaquetengamosdoscajerasindependientes,loqueestamos
diciendoesquedentrodelmismohiloseejecuteprimerolosmtodosdelacajera1ydespuslosmtodosdelacajera2,portantoaniveldeprocesamientoescomosi
tuvisemosunasolacajera:
ClaseMain.java:
publicclassMain{

publicstaticvoidmain(String[]args){

Clientecliente1=newCliente("Cliente1",newint[]{2,2,1,5,2,3});
Clientecliente2=newCliente("Cliente2",newint[]{1,3,5,1,1});

Cajeracajera1=newCajera("Cajera1");
Cajeracajera2=newCajera("Cajera2");

//Tiempoinicialdereferencia
longinitialTime=System.currentTimeMillis();

cajera1.procesarCompra(cliente1,initialTime);
cajera2.procesarCompra(cliente2,initialTime);

Siejecutamosestecdigotendremoslosiguiente:
LacajeraCajera1COMIENZAAPROCESARLACOMPRADELCLIENTECliente1ENELTIEMPO:0seg
Procesadoelproducto1>Tiempo:2seg
Procesadoelproducto2>Tiempo:4seg
Procesadoelproducto3>Tiempo:5seg
Procesadoelproducto4>Tiempo:10seg
Procesadoelproducto5>Tiempo:12seg
Procesadoelproducto6>Tiempo:15seg
LacajeraCajera1HATERMINADODEPROCESARCliente1ENELTIEMPO:15seg
LacajeraCajera2COMIENZAAPROCESARLACOMPRADELCLIENTECliente2ENELTIEMPO:15seg
Procesadoelproducto1>Tiempo:16seg
Procesadoelproducto2>Tiempo:19seg
Procesadoelproducto3>Tiempo:24seg
Procesadoelproducto4>Tiempo:25seg
Procesadoelproducto5>Tiempo:26seg
LacajeraCajera2HATERMINADODEPROCESARCliente2ENELTIEMPO:26seg

Comovemosseprocesaprimerolacompradelcliente1ydespuslacompradelcliente2tardandoenprocesarambascomprasuntiempode26segundos.

Ysienvezdeprocesarprimerounclienteydespusotro,processemoslosdosalavez?,Cuantotardaraelprogramaenejecutarse?.Puesbiensienvezdehabersolo
unaCajera(esdecirunsolohilo),hubiesedosCajeras(esdecirdoshilosothreads)podramosprocesarlosdosclientesalavezytardarmenostiempoenejecutarseel
programa.ParaellodebemosdemodificarlaclaseCajera.javayhacerqueestaclaseherededelaclaseThreadparaheredarysobreescribiralgunosdesusmtodos.
PrimerovamosavercomocodificamosestanuevaclaseCajeraThread.javaydespusexplicamossuscaracteristicas.

publicclassCajeraThreadextendsThread{

privateStringnombre;

privateClientecliente;

privatelonginitialTime;

//Constructor,getter&setter

@Override
publicvoidrun(){

System.out.println("Lacajera"+this.nombre+"COMIENZAAPROCESARLACOMPRADELCLIENTE"

+this.cliente.getNombre()+"ENELTIEMPO:"

+(System.currentTimeMillis()this.initialTime)/1000

+"seg");

for(inti=0;i<this.cliente.getCarroCompra().length;i++){

this.esperarXsegundos(cliente.getCarroCompra()[i]);

System.out.println("Procesadoelproducto"+(i+1)

+"delcliente"+this.cliente.getNombre()+">Tiempo:"

+(System.currentTimeMillis()this.initialTime)/1000

+"seg");
}

System.out.println("Lacajera"+this.nombre+"HATERMINADODEPROCESAR"

+this.cliente.getNombre()+"ENELTIEMPO:"

+(System.currentTimeMillis()this.initialTime)/1000

+"seg");

privatevoidesperarXsegundos(intsegundos){

try{

Thread.sleep(segundos*1000);

}catch(InterruptedExceptionex){

Thread.currentThread().interrupt();

}
}

LoprimeroquevemosyqueyahemoscomentadoesquelaclaseCajeraThreaddebedeheredardelaclaseThread:extendsThread.
Otracosaimportantequevemosesquehemossobreescritoelmtodorun()(deahilaetiqueta@Override).Estemtodoesimprescindiblessobreescribirlo(yaque
esunmtodoqueestaenlaclaseRunnableylaclaseThreadImplementaesaInterface)porqueenlsevaacodificarlafuncionalidadquesehadeejecutarenunhiloes
decir,queloqueseprogrameenelmtodorun()sevaaejecutardeformasecuencialenunhilo.EnestaclaseCajeraThreadsepuedensobreescribirmsmtodos
paraquehaganaccionessobreelhiloothreadcomoporejemplo,pararelthread,ponerloenreposos,etc.Acontinuacinvamosavercomoprogramamoselmtodo
Mainparaqueprocesealosclientesdeformaparalelayvercomosetardamenosenprocesartodo.ElmtodoMainestaenlaclaseMainThread.javaquetieneel
siguientecontenido:
publicclassMainThread{

publicstaticvoidmain(String[]args){

Clientecliente1=newCliente("Cliente1",newint[]{2,2,1,5,2,3});
Clientecliente2=newCliente("Cliente2",newint[]{1,3,5,1,1});

//Tiempoinicialdereferencia
longinitialTime=System.currentTimeMillis();
CajeraThreadcajera1=newCajeraThread("Cajera1",cliente1,initialTime);
CajeraThreadcajera2=newCajeraThread("Cajera2",cliente2,initialTime);

cajera1.start();
cajera2.start();

Ahoravamosavercualseraelresultadodeestaejecucinyvamosacomprobarcomoefectivamenteelprogramaseejecutadeformaparalelaytardasolo15segundos
enterminarsuejecucin:
LacajeraCajera1COMIENZAAPROCESARLACOMPRADELCLIENTECliente1ENELTIEMPO:0seg
LacajeraCajera2COMIENZAAPROCESARLACOMPRADELCLIENTECliente2ENELTIEMPO:0seg
Procesadoelproducto1delclienteCliente2>Tiempo:1seg
Procesadoelproducto1delclienteCliente1>Tiempo:2seg
Procesadoelproducto2delclienteCliente2>Tiempo:4seg
Procesadoelproducto2delclienteCliente1>Tiempo:4seg
Procesadoelproducto3delclienteCliente1>Tiempo:5seg
Procesadoelproducto3delclienteCliente2>Tiempo:9seg
Procesadoelproducto4delclienteCliente2>Tiempo:10seg
Procesadoelproducto4delclienteCliente1>Tiempo:10seg
Procesadoelproducto5delclienteCliente2>Tiempo:11seg
LacajeraCajera2HATERMINADODEPROCESARCliente2ENELTIEMPO:11seg
Procesadoelproducto5delclienteCliente1>Tiempo:12seg
Procesadoelproducto6delclienteCliente1>Tiempo:15seg
LacajeraCajera1HATERMINADODEPROCESARCliente1ENELTIEMPO:15seg

Enesteejemplovemoscomoelefectoescomosidoscajerasprocesasenlacompradelosclientesdeformaparalelasinqueelresultadodelaaplicacinsufraninguna
variacinensuresultadofinal,queeseldeprocesartodaslascomprasdelosclientesdeformaindependiente.Deformagrficavemosqueelprogramaharealizadolo
siguienteendoshilosdistintos:

OtraformadehacerlomismoperosinheredardelaclaseThreadesimplementarlaInterfaceRunnable.Enestecasonodispondremosnipodremossobreescribirlos
mtodosdelaclaseThreadyaquenolavamosautilizarysolovamosatenerquesobreescribirelmtodorun().Enestecasosolosernecesarioimplementarel
mtodorun()paraquelosprocesosimplementadosenesemtodoseejecutenenunhilodiferente.Vamosaverunejemplodecomoutilizandoobjetosdelasclases
Cliente.java y Cajera.java podemos implementar la multitarea en la misma clase donde se llama al mtodo Main de la aplicacin. A continuacin vemos la
codificacinenlaclaseMainRunnable.java:
publicclassMainRunnableimplementsRunnable{

privateClientecliente;

privateCajeracajera;

privatelonginitialTime;

publicMainRunnable(Clientecliente,Cajeracajera,longinitialTime){

this.cajera=cajera;

this.cliente=cliente;

this.initialTime=initialTime;

publicstaticvoidmain(String[]args){

Clientecliente1=newCliente("Cliente1",newint[]{2,2,1,5,2,3});

Clientecliente2=newCliente("Cliente2",newint[]{1,3,5,1,1});

Cajeracajera1=newCajera("Cajera1");

Cajeracajera2=newCajera("Cajera2");

//Tiempoinicialdereferencia

longinitialTime=System.currentTimeMillis();

Runnableproceso1=newMainRunnable(cliente1,cajera1,initialTime);

Runnableproceso2=newMainRunnable(cliente2,cajera2,initialTime);

newThread(proceso1).start();

newThread(proceso2).start();

@Override
publicvoidrun(){

this.cajera.procesarCompra(this.cliente,this.initialTime);
}

Enestecasoimplementamoselmtodorun()dentrodelamismaclasedondeseencuentraelmtodoMain,yenelllamamosalmtododeprocesarCompra()dela
claseCajera.DentrodelmtodoMain,noscreamosdosobjetosdelamismaclaseenlaqueestamos(newMainRunnable)ynoscreamosdosobjetosdelaclaseThread
paralanzarlosprocesoyqueseejecutenestosenparalelo.Elresultadodeestaejecucineselmismoqueenelcasoanterior:
LacajeraCajera2COMIENZAAPROCESARLACOMPRADELCLIENTECliente2ENELTIEMPO:0seg
LacajeraCajera1COMIENZAAPROCESARLACOMPRADELCLIENTECliente1ENELTIEMPO:0seg
Procesadoelproducto1delclienteCliente2>Tiempo:1seg
Procesadoelproducto1delclienteCliente1>Tiempo:2seg
Procesadoelproducto2delclienteCliente2>Tiempo:4seg
Procesadoelproducto2delclienteCliente1>Tiempo:4seg
Procesadoelproducto3delclienteCliente1>Tiempo:5seg
Procesadoelproducto3delclienteCliente2>Tiempo:9seg
Procesadoelproducto4delclienteCliente2>Tiempo:10seg
Procesadoelproducto4delclienteCliente1>Tiempo:10seg
Procesadoelproducto5delclienteCliente2>Tiempo:11seg
LacajeraCajera2HATERMINADODEPROCESARCliente2ENELTIEMPO:11seg
Procesadoelproducto5delclienteCliente1>Tiempo:12seg
Procesadoelproducto6delclienteCliente1>Tiempo:15seg
LacajeraCajera1HATERMINADODEPROCESARCliente1ENELTIEMPO:15seg

CONCLUSIONESYACLARACIONES:
Elconceptodemultitareaomultiprocesamientoesbastantesencillodeentenderyaquesoloconsisteenhacervariascosasalavezsinqueseveaalteradoelresultado
final.Comoyasehadichoenlaentradanotodosepuedeparalelizaryenmuchasocasionessuelesercomplicadoencontrarlamaneradeparalelizarprocesosdentrode
unaaplicacinsinqueestaafectealresultadodelamisma,portantoaunqueelconceptoseafcildeentenderelaplicarloauncasoprcticopuedesercomplicadopara
queelresultadodelaaplicacinnoseveaafectado.
Porotroladoparalosqueempecisaverestostemasdelaconcurrencia,multitareaydems,nosopreocupisalprincipiosioscuestaprogramarproblemasdeestetipo
yaqueapartedelamultitareasemezclancosascomolaherenciaylasInterfacesquealprincipiosoncosasquecuestandeasimilar,asqueirpocoapocoperotener
muyclaroquelamultitareaesmuyutilysehadeaplicarparahacerlasaplicacionesmseficientesyquedenmejorrendimiento.

ArtculosRelacionados

También podría gustarte