Beruflich Dokumente
Kultur Dokumente
Threads en Java
Hilos(Threads)enJava
EnlaprimerapartedeestecursovimosprocesosensistemasoperativosquesurgendeUnix.Enesos ejemploscadaprocesosecaracterizabaportenerunnicocontroldeflujo,esdecirlaejecucindel programaseguaunasecuencianica.Cuandocreamosunnuevoprocesoconfork,creamosunanueva secuenciaqueseejecutaconcurrentementeconelprocesopadre,peronocompartenlaszonasdedatosyla comunicacinentreellosesmuylimitada.Porelloaparecenlaspipesylosotrosmecanismosde comunicacinentreprocesos. Loshilossonotraformadecrearlaposibilidaddeconcurrenciadeactividadessinembargo,lagran diferenciaesqueloshiloscompartenelcdigoyelaccesoaalgunosdatosenformasimilaracomoun objetotieneaccesoaotrosobjetos.EnJavaunhiloesunobjetoconcapacidaddecorrerenforma concurrenteelmtodorun().Enciertamaneraescomotenerdos"programcounters"paraunmismo cdigo.Unadiferenciaconlosprocesosesquecarecedesentidoynoesposibleenesteenfoquehacer mutarunprocesoconalgosimilaraexec().
DefinicinThread
Unathreadesunnicoflujodecontroldentrodeunprograma.Algunasvecesesllamadocontexto deejecucinporquecadathreaddebetenersuspropiosrecursos,comoelprogramcounteryelstack deejecucin,comoelcontextodeejecucin.Sinembargo,todathreadenunprogramaancomparte muchosrecursos,talescomoespaciodememoriayarchivosabiertos.Threadstambinsonllamadas procesoslivianos(lightweightprocess). NOTA:Esmuchomssimplecrearydestruirunathreadqueunproceso.
profesores.elo.utfsm.cl/~agv/elo330/2s09/lectures/Java/threads/JavaThreads.html
1/6
06/04/13
Threads en Java
Ejemplo:Programadethreadnica EnelprogramaWithoutThread.java,elmtodorun()enlaclaseNoThreadPseudoIOescreadopara simularunaoperacindeIOde10segundos.ElprogramaprimerosimularunaoperacindeIO. MtodosdelProgramadeThreadnica ElmtodoshowElapsedTime()imprimeeltiempoensegundosdesdequeelprogramaparti,junto conelmensajedelusuario.ElmtodocurrentTimeMillis()delaclaseSystemdelpaquetejava.lang retornaunenteroquecorrespondealadiferenciadetiempoenmilisegundosdesdelahora00:00:00 GMTonJanuary1,1970.alaactual. EjemplodeprogramaMultithreded(multihilo) ElprogramamultithreadedWithThread.javadeclaralaclaseparasimularIOcomounasubclasedela claseThread.Despusquelathreadescreada,elprogramamultihilos(multithreaded)usaelmtodo start()delaclaseThreadparahacerpartirlaoperacindeIO.Elmtodostart()asuvezllamaarun() delasubclase.
CreacinyejecucindeThreads
Haydosformasdehacerunatareacorrerconcurrentementeconotra:crearunanuevaclase comosubclasedelaclaseThreadodeclararunaclaseeimplementarlainterfazRunnable. UsodeSubclase CuandosecreaunasubclasedeThread,lasubclasedeberadefinirsupropiomtodorun()para sobremontarelmtodorun()delaclaseThread.Latareaconcurrenteesdesarrolladaeneste mtodorun(). Ejecucindelmtodorun() Unainstanciadelasubclaseescreadaconnew,luegollamamosalmtodostart()delathreadpara hacerquelamquinavirtualJavaejecuteelmtodorun().Ojoparainiciarlaconcurrenciainvocamos astart(),asinvocamosarun()enformaindirecta.Siinvocamosarun()directamente,secomportar comoelllamadoacualquiermtodollamadodentrodeunmismohilo(sincrearunoindependiente). ImplementacindelaInterfazRunnable LainterfazRunnablerequierequeslounmtodoseaimplementado,elmtodorun().Primero creamosunainstanciadeestaclaseconnew,luegocreamosunainstanciadeThreadconotra sentencianewyusamoselobjetorecincreadoenelconstructor.Finalmente,llamamoselmtodo start()delainstanciadeThreadparainiciarlatareadefinidaenelmtodorun().
profesores.elo.utfsm.cl/~agv/elo330/2s09/lectures/Java/threads/JavaThreads.html
2/6
06/04/13
Threads en Java
ControldelaEjecucindeunaThread
Variosmtodosdelaclasejava.lang.Threadcontrolanlaejecucindeunathread. Mtodosdeusocomn: voidstart():usadoparainiciarelcuerpodelathreaddefinidoporelmtodorun(). voidsleep():poneadormirunathreadporuntiempomnimoespecificado. voidjoin():usadoparaesperarporeltrminodelathreadsobrelacualelmtodoesinvocado,por ejemploportrminodemtodorun(). voidyield():Muevealathreaddesdeelestadodecorriendoalfinaldelacoladeprocesosenespera porlaCPU. MethodTest.java Java2dejobsoleto(deprecated)variosdeestosmtodosdefinidosenversionesprevias(Java1.0y Java1.1.)paraprevenirinconsistenciadedatosydeadlock.Serecomiendaevitarelusodeestos mtodos.Ellosson: voidstop()elcualdetienelaejecucindelathreadnoimportandoconsideracinalguna. voidsuspend()elcualparatemporalmentelaejecucindeunathread. voidresume()reactivaunathreadsuspendida. Otrosejemplos: Mltipleshiloscadaunoconcontadordown. Mltipleshiloscontrolandobloquesdecoloresquecambian
CiclodeVidadeunaThread
Cadahilo,despusdesucreacinyantesdesudestruccin,estarenunodecuatroestados:recin creada,"corrible",bloqueada,omuerta.
profesores.elo.utfsm.cl/~agv/elo330/2s09/lectures/Java/threads/JavaThreads.html
3/6
06/04/13
Threads en Java
Recincreada(Newthread):entraaquinmediatamentedespusdesucreacin.Esdecirluegodel llamadoanew.Enesteestadolosdatoslocalessonubicadoseiniciados.Luegodelainvocacina start(),elhilopasaalestado"corrible". Corrible (Runnable): Aqu el contexto de ejecucin existe y el hilo puede ocupar la CPU en cualquiermomento.Esteestadopuedesubdividirseendos:Corriendoyencolado.Latransicinentre estosdosestadosesmanejadoporleitineradordelamquinavirtual. Nota:Unhiloqueinvocaalmtodoyield()voluntariamentesemueveasmismaalestadoencolado desdeelestadocorriendo. Bloqueada(notRunnable):Seingresacuando:seinvocasuspend(),elhiloinvocaelmtodowait() dealgnobjeto,elhiloinvocasleep(),elhiloesperaporalgunaoperacindeI/O,oelhiloinvoca join()deotrohiloparaesperaporsutrmino.ElhilovuelvealestadoCorriblecuandoeleventopor queesperaocurre. Muerta(Dead):Sellegaaesteestadocuandoelhiloterminasuejecucin(concluyeelmtodorun) oesdetenidaporotrohilollamandoalsumtodostop().Estaltimaaccinnoesrecomendada. El siguiente cdigo puede ser usado para evitar el llamado a stop() y as evitar estados de inconsistencia. Invocando a safeStop() se consigue terminar el hilo la prxima vez que la variable doneeschequeada. booleandone=false publicvoidrun(){ while(!done){ .... } } publicsafeStop(){ done=true } ElmtodoisAlive()invocadosobreunhilo,permitesabersianpuedecorrer.
Sincronizacindehilos
Todosloshilosdeunprogramacompartenelespaciodememoria,haciendoposiblequedoshilos accedanlamismavariableocorranelmismomtododeunobjetoal"mismotiempo".Secreaasla necesidaddedisponerdeunmecanismoparabloquearelaccesodeunhiloaundatocrticosiel datoestsiendousadoporotrohilo.
profesores.elo.utfsm.cl/~agv/elo330/2s09/lectures/Java/threads/JavaThreads.html
4/6
06/04/13
Threads en Java
Porejemplo,sienunsistemaunmtodopermitehacerundepsitoyluegodoshilosloinvocan,es posiblequealfinalsloundepsitoquederegistradoalejecutarlasinstruccionesenforma traslapadas. Deposit.java ModelodeMonitores Javautilizalaideademonitoresparasincronizarelaccesoadatos.Unmonitoresunlugarbajo guardiadondetodoslosrecursostienenelmismocandado.Slounallaveabretodosloscandados dentrodeunmonitor,yunhilodebeobtenerlallaveparaentraralmonitoryaccederaesosrecursos protegidos.CadaobjetoenJavaposeeuncandadoyunallaveparamanejodezonascrticas. Tambinexisteuncandadoyllaveporcadaclase,steseusaparalosmtodosestticos. Sivarioshilosdeseanentraralmonitorsimultneamente,slounoobtienelallave.Losotrosson dejadosfuera(bloqueados)hastaqueelhiloconlallaveterminedeusarelrecursoexclusivoy devuelvalallavealaMquinaVirtualJava. Puedeocurrirdeadlocksidoshilosestnesperandoporelrecursocuyallavelatieneelotro. Enunmomentounhilopuedetenerlasllavesdevariosmonitores. EnJavalosrecursosprotegidosporunmonitorsonfragmentodeprogramaenformademtodoso bloquesdesentenciasencerradasconparntesis{}. Palabrareservadasynchronized:esusadaparaindicarqueelsiguientemtodoobloquede sentenciasessincronizadaporunmonitor(aquldelobjetoquetieneelmtodo).Cuandoqueremos sincronizarunbloque,unobjetoencerradopor()siguealapalabrasynchronized,aslamquina virtualsabequmonitorchequear. Porejemplo,elmtododeposit()puedesersincronizadoparacorrerslounhiloalavez. Lasalidadelprogramaalternativoescasiigual,exceptoqueelprimermensajedelsegundohiloes traslapadoconeldelaprimera,porqueelprimerprintln()noestdentrodelbloquesynchronized. Deposit2.java Llavedelmonitor Existeunllavenicaporcadaobjetoquecontieneunmtodosincronizado(synchronized)asociado asuinstancia(mtodonoesttico),oqueesreferenciadoenunbloquesynchroinized(esusado comoargumentodeestasentencia).Porellocadaobjetoycadaclasepuedetenerunmonitorsihay cualquiermtodosincronizadoobloquedesentenciasasociadoconellos.Msan,lallavedeun monitordeunaclaseesdiferentedelasllavesdelosmonitoresdelasinstancias(estoporqueel mtodopuedeserllamadoantesdeexistirningunainstancia).
Multihilosmsavanzada
Paralograrbuenasincronizacinentrelastareasenocasionesdebemoshacerusodeotros mecanismosdesincronizacin.Parelloveremoselejemplodeunproductordenmerosenterosyun consumidordeellos.
profesores.elo.utfsm.cl/~agv/elo330/2s09/lectures/Java/threads/JavaThreads.html
5/6
06/04/13
Threads en Java
Productorconsumidor NoWaitPandC.java Esteprogramanogarantizaquetodoslosenterosgeneradossernledoyquecadaenteroserledo slounavez.LasentenciaSynchronizedgarantizaqueslounaoperacinseahechaalavez,pero nogarantizaqueamboshiloslohaganelformaalternada. Paralograralternancia,usamoslosllamadoswaitynotify. Mtodowait()harqueelhiloqueinvocasebloqueehastaqueocurrauntimeoutuotrohilollameel mtodonotify()onotifyAll()sobreelmismoobjeto(loprimeroqueocurra). Cuandounhilollamaawait(),lallavequestetieneesliberada,asotroprocesoqueesperabapor ingresaralmonitorpuedehacerlo.notify()slodespiertaodesbloqueaunhilo,silohayesperando. notifyAll()despiertaatodoslosqueestnesperando.Luegoqueunhilodespiertaycomopartedel wait()tratardereingresaralmonitorpidiendolallavenuevamente,podratenerqueesperaraque otrohilolalibere. Losllamadoswait(),notify()ynotifyAll(),slopuedenserllamadosdentrodeunmtodoobloque sincronizado. PandC.java
profesores.elo.utfsm.cl/~agv/elo330/2s09/lectures/Java/threads/JavaThreads.html
6/6