Вы находитесь на странице: 1из 6

06/04/13

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.

ThreadParalelasyConcurrentes Cuandodosthreadscorrenenparalelo,ambasestnsiendocorridasalmismotiempoendiferentes CPUs.Dosthreadconcurrentesestnenprogreso,ointentandodeobtenertiempodeejecucindela CPUalmismotiempo,perononecesariamenteestncorriendoenformasimultneaendosCPUs diferentes.

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

RunnableThread.java Unainstanciadeunaclasequedefinaelmtodorun()yaseacomosubclasedeThreado implementandolainterfazRunnabledebeserpasadacomoargumentoenlacreacindeuna instanciadeThread.Cuandoelmtodostart()deestainstanciaesllamado,Javaruntimesabequ mtodorun()ejecutar.

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

Вам также может понравиться