Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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