You are on page 1of 12

15/02/13

ASSINE08007033000 BATEPAPO

Cap. 9 - Threads (Segmentos) - Java Free.org


EMAIL SAC BUSCAR VOIP EMAILGRTIS SHOPPING NDICEPRINCIPAL

Login
>

Registrese CONTRIBUIR
Curtir 728 84

HOME

NOTCIAS

ARTIGOS

FRUM

BUSCA

ENVIARNOTCIA

Home>Artigos>Certificao>

Cap.9Threads(Segmentos)
Publicadoporkuesleyem28/08/2009117.253visualizaes
24

Like

comentrios:3 EhCaptulo9Threads 9.1UmavisosobreThreads Antes de qualquer estudo mais aprofundado sobre threads, gostaramos de deixar bem claro alguns pontos importantes para o sucesso da absoro do contedo dessecaptulo. Com o crescimento do poder de processamento dos computadores modernos, e as inovaes dos sistemas operacionais para criar um ambiente de trabalho amigvel junto aos seus usurios, uma srie de inovaes foram acrescidas, e, um recurso que ganhou espao e tem se mostrato bastante interessante o processamento paralelo, onde um processo pode se dividir em inmeros processos de dimenses menores para resolver problemas distintos. Calma que no mgica.Oqueacontecenaverdadeoseguinte:emumambientemonoprocessado,umprocessomaiorqueresponsvelpelossubprocessosdivideotempodo processador entre esses subprocessos, ou seja, comea a executar o subprocesso 01, aps algum tempo (esse tempo depende da JVM e SO) esse processo fica aguardandosuavezdecontinuarsendoexecutado,apartirdaoprocessadorestlivreparaexecuodeumoutroprocesso,atquenovamenteosubprocesso01 voltaaserexecutado,atqueporalgummotivoeletermina.Esserecursobastanteintrigantepoispermitenosresolverproblemasquelevaramosumtempobem superior,umavezquesemessepoderdeescalonaroprocessador,oprocessocomeariaeterminariaparaassimliberaroprocessadorainiciaraexecuodeum novoprocesso. Emjava,temosduasalternativasparaimplementarorecursodemultithread: a)EstendendodaClasseThread b)ImplementandoaInterfaceRunnable Vejamosumexemploparacadamtodo: a)Estendendodejava.lang.Thread:

p u b l i c c l a s s E x e c u c a o { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { P r o c p = n e w P r o c ( ) p . s t a r t ( ) w h i l e ( t r u e ) { S y s t e m . o u t . p r i n t l n ( " t h r e a d m a i n e x e c u t a n d o " ) } } } c l a s s P r o c e x t e n d s T h r e a d { p u b l i c v o i d r u n ( ) { w h i l e ( t r u e ) { S y s t e m . o u t . p r i n t l n ( " t h r e a d e x e c u t a n d o " ) } } }

b)ImplementandoainterfaceRunnable

p u b l i c c l a s s E x e c u c a o { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { P r o c p = n e w P r o c ( ) T h r e a d t = n e w T h r e a d ( p ) t . s t a r t ( ) w h i l e ( t r u e ) { S y s t e m . o u t . p r i n t l n ( " t h r e a d m a i n e x e c u t a n d o " ) } } }

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

1/12

15/02/13

Cap. 9 - Threads (Segmentos) - Java Free.org

c l a s s P r o c i m p l e m e n t s R u n n a b l e { p u b l i c v o i d r u n ( ) { w h i l e ( t r u e ) { S y s t e m . o u t . p r i n t l n ( " t h r e a d e x e c u t a n d o " ) } } }

Pormaisqueoscdigosacimapossamnotermuitosentido,possolhegarantirquefuncionam.Omtodomainumathreadeinstanciaumobjetopquetambm instanciadeumaclassequeestendedeThread.Omtodostart()chamado,informaaoescalonadordethreadquecoloquenafiladeexecuoaThreadp,mas nopensequeathreadpvaiexecutarimediatamentequandoomtodostartfoichamado,somentesinalizaoescalonador(ei,eusoupesouthread,meexecute assimquepuder,obrigado). 9.2Oqueumathreadexecuta Voc j deve ter notado que nos exemplos anteriores o cdigo da Thread fica no mtodo run, porm mostramos duas formas de se executar um thread, ento vamosentender.QuandoumaclasseherdadeThreadeimplementaseumtodoabstratorun,ocdigoqueseencontrardentroexecutado.Jquandoumaclasse implementa Runnable e implementa o mtodo run, o mtodo que executado o mtodo da classe que implementa a interface Runnable. Voc nunca poder chamar diretamente o mtodo run de uma classe Thread, pois assim, o processador no ser dividido entre os diversos processos, voc dever chamar o mtodo startparaqueoescalonadorsaibadaexistnciadaThread,edeixequeomtodorunsejaexecutadopeloescalonador.Sevocnochamaromtodostart,sua threadnuncaserexecutada. Aassinaturadomtodorun:

p u b l i c v o i d r u n ( )

Notequeomtodonolananenhumaexceochecada,issosignificaquevocnopoderfazer. 9.3MtodosimportantesdaclasseThread Osmtodosaseguirprecisamserdecorados,lembradosnahoradoexame: run()ocdigoqueathreadexecutar. start()sinalizaJVMqueathreadpodeserexecutada,massaibaqueessaexecuonogarantidaquandoessemtodochamado,eissopodedependerda JVM. isAlive()voltatrueseathreadestsendoexecutadaeaindanoterminou. sleep()suspendeaexecuodathreadporumtempodeterminado yield()tornaoestadodeumathreadexecutvelparaquethreadcomprioridadesequivalentespossamserprocessadas,issoserestudandomaisadiante currentThread()ummtodoestticodaclasseThreadquevoltaqualathreadqueestsendoexecutada. getName() volta o nome da Thread, voc pode especificar o nome de uma Thread com o mtodo setName() ou na construo da mesma, pois existe os construtoressobrecarregados. 9.4Mtodosherdadosdejava.lang.ObjectrelacionadoscomThreads OsmtodosaseguirpertencemclasseObject,pormestorelacionadoscomaprogramaoMultiThreading:

p u b l i c f i n a l v o i d w a i t ( ) p u b l i c f i n a l v o i d n o t i f y ( ) p u b l i c f i n a l v o i d n o t i f y A l l ( )

Examinaremososmtodosacimacitados,pormantesdequalquercoisaprecisamosentenderosestadosdeumathread,eissoquevamosentenderapartirde agora. 9.5Estadosdossegmentos Novoestadoqueumathreadficanomomentodesuainstanciao,antesdachamadadomtodostart() Executvel estadoemqueathreadficadisponvelparaserexecutadaenoaguardodoescalonadordethread,esperandoasuavezdeseexecutar ExecuoMomentoemqueathreadestexecutando,estoperando,trabalhando,pagandoseusalrioesuaexecuocontinuaatqueporalgummotivo(que veremosbrevemente)essemomentointerrompido Espera/Bloqueio/Suspenso esse estado pode ser dar por inmeros motivos, e vamos tentar esplanar alguns. Uma thread em seu grande momento de glria (suaexecuo)podesebloquearporquealgumrecursoouobjetonoestdisponvel,porissoseuestadopodeficarbloqueado,atqueesserecurso/objetoesteja disponvelnovamenteassimseuestadotornaseexecutvel,ouento,umathreadpodeficarsuspensaporqueoprogramadordefiniuumtempodeespera,assim queessetempoexpiraressathreadvoltaaoestadoexecutvelparacontinuarseusservios Inativoapartirdomomentoemqueomtodorun()foiconcludo,athreadsetornarinativa,pormaindaexistiroobjetonamemria,somentenocomouma linha de execuo, e no poder novamente se estartado, ou seja, qualquer tentativa de chamada do mtodo start() aps a concluso do mtodos run(), uma

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

2/12

15/02/13
exceoserlanadaenoduvide

Cap. 9 - Threads (Segmentos) - Java Free.org

9.6Impedindoumathreaddeserexecutada Suspendendoumathread Penseemumasituaoemquevoctenha10Threadrodandosimultneamente(sei,eufuiredundanteagora),pormumadelasvocdesejatarefarealizada,ela aguarde 5 minutos para prosseguir suas tarefas, por mais que isso parea loucura, mas possvel, voc poder usar o mtodo sleep para tornar uma thread no modosuspensoatqueessetempoexpire,vejamossuasintaxe:

t r y { s l e e p ( 5 * 6 0 * 1 0 0 0 ) } c a t c h ( I n t e r r u p t e d E x c e p t i o n e x ) { }

O cdigo acima, faz com que a thread espere por 5 minutos at voltar ao estado Executvel, porm uma alternativa quando se pretende executar as thread de formamaisorganizada,apesardequelembresesempre:VOCNUNCATERGARANTIASQUANTOAORDEMDAEXECUODASTHREAD,POISISSO VAIDEPENDERDOESCALONADOR! Qualquerperguntacomrelaotentativadegarantirumordem,ousequenciadeexecuodasthread,nohesiteemmarcaraalternativaquedizquenoexiste garantiasparataltarefa. Nopensequeotempoqueforespecificadonomtodosleepserexatamentootempoqueathreadficarsemexecutar,anicagarantiaqueteremosqueesse serotempomnimo,pormapsoseutrmino,seuestadopassaparaExecutvelenoExecuo. Tenhaemmentequeomtodosleepummtodoesttico,portantovocnopoderchamaromtodosleepdeumthreadxouy,somentedathreadqueestiver emestadodeexecuo. Vejamosumexemploprtico:

p u b l i c c l a s s E x e c 1 1 { p u b l i c s t a t i c v o i d m a i n ( S t r i n g a r g s [ ] ) { C o n t a d o r c 1 = n e w C o n t a d o r ( ) c 1 . s e t Q t d e ( 1 0 ) c 1 . s e t N a m e ( " t 0 0 1 " ) c 1 . s t a r t ( ) C o n t a d o r c 2 = n e w C o n t a d o r ( ) c 2 . s e t Q t d e ( 1 5 ) c 2 . s e t N a m e ( " t 0 0 2 " ) c 2 . s t a r t ( ) } } c l a s s C o n t a d o r e x t e n d s T h r e a d { p r i v a t e i n t q t d e = 0 p u b l i c v o i d r u n ( ) { f o r ( i n t i = 0 i < = 1 0 0 i + + ) { i f ( ( i % q t d e ) = = 0 ) { S y s t e m . o u t . p r i n t l n ( T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) + " > " + i ) } t r y { s l e e p ( 5 0 0 ) } c a t c h ( I n t e r r u p t e d E x c e p t i o n e x ) { } } } p u b l i c v o i d s e t Q t d e ( i n t v a l u e ) { t h i s . q t d e = v a l u e i f ( t h i s . q t d e = = 0 ) t h i s . q t d e = 1 0 } }

Pormaisquetenhasetentadoestabelecerumaordem,sevocexecutarocdigoacimairperceberquenohgarantiasdeordemnaexecuo.

9.7Prioridades Aprioridadetambmassuntocontundente,poiscadaJVMdefineasuamaneiradeescolherathreadquepassardoestadodeexecutvelparaexecuo.Poisa especificaoJavanodefinenadaarespeito.Porissonoconfieemprioridadesparagarantirumaexecuosincronizadasdesuasthreads,useasparamelhorar aeficinciadesuastarefas.Paradefinirumaprioridadeparaumathreadvocusaromtodo

p u b l i c v o i d s e t P r i o r i t y ( x x x )

ondexxxumnmerointeirocompreendidoentre1e10 Aprioridadepadro5,ouseja,senofordefinidanenhumaprioridade,serassumidoovalor5paraathread.

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

3/12

15/02/13

Cap. 9 - Threads (Segmentos) - Java Free.org

Voc poder cair em uma situao em que poder ter vrias thread com a mesma prioridade, e desejar que thread que estiver executando d lugar para outras seremprocessadas,eparaissoexisteomtodoyield()quefazjustamenteisso,tornaoestadodeexecuodathreadatualparaexecutveledolugarparaas demaisthreaddeprioridadessemelhantes.Noobstanteaisso,nogarantequeathreadquevaiserexecutada,nosejaamesmaqueacaboudesairdoestado deexecuo,portantoessemtodotambmnogarantefazeroqueseprope. 9.8HierarquiadeThreads ImaginequevoctenhaumathreadYquespoderserexecutadaquandoathreadXconcluirsuatarefa,vocpoderligarumathreadoutra,usandoomtodo join(),vamosentenderissoapartirdeagora: Examinemosocdigoaseguir:

p u b l i c c l a s s E x e c 1 2 { p u b l i c s t a t i c v o i d m a i n ( S t r i n g a r g s [ ] ) { t r y { C o n t a d o r c 1 = n e w C o n t a d o r ( ) c 1 . s e t Q t d e ( 1 0 ) c 1 . s e t N a m e ( " t 0 0 1 " ) c 1 . s t a r t ( ) c 1 . j o i n ( ) f o r ( i n t i = 0 i < = 1 0 0 i + + ) { i f ( ( i % 5 ) = = 0 ) { S y s t e m . o u t . p r i n t l n ( T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) + " > " + i ) } } } c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) { } } } c l a s s C o n t a d o r e x t e n d s T h r e a d { p r i v a t e i n t q t d e = 0 p u b l i c v o i d r u n ( ) { f o r ( i n t i = 0 i < = 1 0 0 i + + ) { i f ( ( i % q t d e ) = = 0 ) { S y s t e m . o u t . p r i n t l n ( T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) + " > " + i ) } t r y { s l e e p ( 5 0 0 ) } c a t c h ( I n t e r r u p t e d E x c e p t i o n e x ) { } } } p u b l i c v o i d s e t Q t d e ( i n t v a l u e ) { t h i s . q t d e = v a l u e i f ( t h i s . q t d e = = 0 ) t h i s . q t d e = 1 0 } }

Resultadodocdigoacima: t001>0 t001>10 t001>20 t001>30 t001>40 t001>50 t001>60 t001>70 t001>80 t001>90 t001>100 main>0 main>5 main>10 main>15 main>20 main>25 main>30 main>35 main>40 main>45 main>50 main>55 main>60 main>65 main>70 main>75 main>80 main>85 main>90

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

4/12

15/02/13
main>95 main>100

Cap. 9 - Threads (Segmentos) - Java Free.org

OexemploacimagarantequeathreadmainsserexecutadaquandoaThreadt001estiverinativa. Vamoscomplicarumpouco....Omtodojoinsobrecarregadoepodereceberumvalorlongquecorrespondequantidademillissegundosqueathreadmain(em nossocaso)anterioresperaatquet001seconcluir,seamesmanoficarinativanotempoinformado,nadamaisgarantido,ouseja,oescalonadorpoderiniciar aexecuodeambasasthreads.Vamosalterarumpoucoocdigoeobservarosresultados:

p u b l i c c l a s s E x e c 1 3 { p u b l i c s t a t i c v o i d m a i n ( S t r i n g a r g s [ ] ) { t r y { C o n t a d o r c 1 = n e w C o n t a d o r ( ) c 1 . s e t Q t d e ( 1 0 ) c 1 . s e t N a m e ( " t 0 0 1 " ) c 1 . s t a r t ( ) c 1 . j o i n ( 5 0 0 0 ) f o r ( i n t i = 0 i < = 1 0 0 i + + ) { i f ( ( i % 5 ) = = 0 ) { S y s t e m . o u t . p r i n t l n ( T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) + " > " + i ) } } } c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) { } } } c l a s s C o n t a d o r e x t e n d s T h r e a d { p r i v a t e i n t q t d e = 0 p u b l i c v o i d r u n ( ) { f o r ( i n t i = 0 i < = 1 0 0 i + + ) { i f ( ( i % q t d e ) = = 0 ) { S y s t e m . o u t . p r i n t l n ( T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) + " > " + i ) } t r y { s l e e p ( 2 5 0 ) } c a t c h ( I n t e r r u p t e d E x c e p t i o n e x ) { } } } p u b l i c v o i d s e t Q t d e ( i n t v a l u e ) { t h i s . q t d e = v a l u e i f ( t h i s . q t d e = = 0 ) t h i s . q t d e = 1 0 } }

Resultado: t001>0 t001>10 main>0 main>5 main>10 main>15 main>20 main>25 main>30 main>35 main>40 main>45 main>50 main>55 main>60 main>65 main>70 main>75 main>80 main>85 main>90 main>95 main>100 t001>20 t001>30 t001>40 t001>50 t001>60 t001>70 t001>80 t001>90 t001>100

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

5/12

15/02/13

Cap. 9 - Threads (Segmentos) - Java Free.org

Notequeathreadmainsesperoupelotempode5000(5segundos)apartirdaielacomeousuaexecuo. 9.9Sincronizao Oassuntoagoraumpoucomaiscomplicadodoqueoestudadoatagora,poistratadecomoduasoumaisthreadspodemcompartilharomesmoobjeto,ouseja, quaissoosriscosquecorremosquandodoisobjetospodemservistossimultneamente. Cenrio: ImaginemosumprocessodecompraonlinepelaInternet,ondeinmeraspessoampodemconsultarositensdisponveisemestoqueerealizarseuspedidos.Pois bem, como no queremos causar situaes indigestas com nossos clientes, precisamos garantir com seus pedidos sejam faturados corretamente. Bom onde queremos chegar ? Imagine que temos 5 aparelhos celulares S55 SIEMENS em nosso estoque e que foi lanado uma promoo desse aparelho e 200 pessoas estodispostasaentrarnotapaporumaparelho,bemtemosquegarantirqueesseprocessosejaconcretizadosemmaioresproblema.(tudoissofoiditoparase esplanarasituao...)Vejamoscomoresolveresseproblema:

p u b l i c c l a s s P e d i d o C o m p r a { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { P r o d u t o p = n e w P r o d u t o ( 5 ) T h r e a d [ ] t = n e w T h r e a d [ 1 5 ] f o r ( i n t i = 0 i < t . l e n g t h i + + ) { t [ i ] = n e w T h r e a d ( p ) t [ i ] . s e t N a m e ( " C l i e n t e : " + i ) t [ i ] . s t a r t ( ) } } } c l a s s P r o d u t o i m p l e m e n t s R u n n a b l e { p r i v a t e i n t e s t o q u e = 5 p u b l i c v o i d r u n ( ) { t r y { f o r ( i n t i = 0 i < 2 i + + ) { e f e t u a r P e d i d o ( ) } } c a t c h ( E x c e p t i o n e x ) { } } p u b l i c v o i d e f e t u a r P e d i d o ( ) { t r y { i f ( t h i s . e s t o q u e > 0 ) { S y s t e m . o u t . p r i n t l n ( " P e d i d o f a t u r a d o p a r a o c l i e n t e " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) ) T h r e a d . s l e e p ( 2 5 0 ) t h i s . e s t o q u e } e l s e { S y s t e m . o u t . p r i n t l n ( " N o t e m e s t o q u e p a r a o c l i e n t e " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) ) } } c a t c h ( E x c e p t i o n e x ) { } } p u b l i c P r o d u t o ( i n t v a l u e ) { t h i s . e s t o q u e = v a l u e } }

Notentervenderoprogramaacimaparaalgumalojaquevocserescurraado! O cdigo de efetuar pedido, sempre efetuar o pedido tendo ou no estoque, note que na sada houve 10 cliente que efetuaram seus pedidos com estoque estourado: PedidofaturadoparaoclienteCliente:0 PedidofaturadoparaoclienteCliente:1 PedidofaturadoparaoclienteCliente:2 PedidofaturadoparaoclienteCliente:3 PedidofaturadoparaoclienteCliente:5 PedidofaturadoparaoclienteCliente:6 PedidofaturadoparaoclienteCliente:8 PedidofaturadoparaoclienteCliente:9 PedidofaturadoparaoclienteCliente:10 PedidofaturadoparaoclienteCliente:11 PedidofaturadoparaoclienteCliente:4 PedidofaturadoparaoclienteCliente:7 PedidofaturadoparaoclienteCliente:12 PedidofaturadoparaoclienteCliente:13 PedidofaturadoparaoclienteCliente:14 PedidofaturadoparaoclienteCliente:0 PedidofaturadoparaoclienteCliente:1 PedidofaturadoparaoclienteCliente:2 PedidofaturadoparaoclienteCliente:3 NaotemestoqueparaoclienteCliente:5

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

6/12

15/02/13
NaotemestoqueparaoclienteCliente:6 NaotemestoqueparaoclienteCliente:8 NaotemestoqueparaoclienteCliente:9 NaotemestoqueparaoclienteCliente:11 NaotemestoqueparaoclienteCliente:10 NaotemestoqueparaoclienteCliente:4 NaotemestoqueparaoclienteCliente:12 NaotemestoqueparaoclienteCliente:7 NaotemestoqueparaoclienteCliente:13 NaotemestoqueparaoclienteCliente:14

Cap. 9 - Threads (Segmentos) - Java Free.org

Oquequeremosnopermitirquehajafaturamentocasooestoqueestejanegativo. Pelo resultado no muito difcil deduzir o que aconteceu nesse processamento embora voc possa executar e obter outro resultado. Observe que todos os pedidossforamefetuadosporquehnomtodoefetuarPedidoumasuspensodaexecuodasthreadparasuaconcretizao,ouseja,atomomentoemquea thread volta aps sua suspenso, o pedido ainda no foi efetuado, com isso, outros clientes podem efetuar seus pedidos quando esse ciclo se repetir para os 5 primeirosclientes,asim,nosermaispossvelconcretizarpedidos,poisoestoquedoitemsetornou0.Pormnofoiexatamenteissoqueaconteceuemnosso exemploanterior.Evoccapazdedescobrirporque? A grande sacada do programa anterior suspender a thread por um tempo para que antes de concluir sua operao, dando lugar as outras, fazendo com que o estoquefiquenegativo. Masexisteumasoluoparaqueesse"erro"sejarevertido,ouseja,nopermitirquedoisclientespossamconcluirseuspedidosaomesmotempo. Vamosalterarocdigoanterior,eacrescentaromodificarsynchronizedquenopermitecomque2threadexecutemomesmomtodoaomesmotempo,ouseja, asdemaisthreadficamesperandoatqueathreademexecuoconcluaseuprocessamentoparaassiminiciaroseu. Resultado: PedidofaturadoparaoclienteCliente:0 PedidofaturadoparaoclienteCliente:1 PedidofaturadoparaoclienteCliente:2 PedidofaturadoparaoclienteCliente:3 PedidofaturadoparaoclienteCliente:4 NaotemestoqueparaoclienteCliente:5 NaotemestoqueparaoclienteCliente:6 NaotemestoqueparaoclienteCliente:7 NaotemestoqueparaoclienteCliente:8 NaotemestoqueparaoclienteCliente:10 NaotemestoqueparaoclienteCliente:11 NaotemestoqueparaoclienteCliente:12 NaotemestoqueparaoclienteCliente:13 NaotemestoqueparaoclienteCliente:14 NaotemestoqueparaoclienteCliente:9 NaotemestoqueparaoclienteCliente:0 NaotemestoqueparaoclienteCliente:1 NaotemestoqueparaoclienteCliente:2 NaotemestoqueparaoclienteCliente:3 NaotemestoqueparaoclienteCliente:4 NaotemestoqueparaoclienteCliente:5 NaotemestoqueparaoclienteCliente:6 NaotemestoqueparaoclienteCliente:7 NaotemestoqueparaoclienteCliente:8 NaotemestoqueparaoclienteCliente:10 NaotemestoqueparaoclienteCliente:11 NaotemestoqueparaoclienteCliente:12 NaotemestoqueparaoclienteCliente:13 NaotemestoqueparaoclienteCliente:14 NaotemestoqueparaoclienteCliente:9 Notequeasadaagoramelhorou!Ehouvefaturamentosomentedos5itens! PensamentoEntrpico:Fazercondiesechecagensparaevitarqueoestoquefiquenegativo!Lembresesempre,vocnuncatercertezadaordemdaexecuo dasthread,ouseja,umathreadpodecomear(tendoestoque5)eterminarquandooestoquejacabou,outrasthreadsforammaisrapidas..... Outroexemplo:

p u b l i c c l a s s T e s t { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { C r e d i a r i o c 1 = n e w C r e d i a r i o ( ) C r e d i a r i o c 2 = n e w C r e d i a r i o ( ) T h r e a d t 1 = n e w T h r e a d ( c 1 ) t 1 . s e t N a m e ( " t 1 " ) T h r e a d t 2 = n e w T h r e a d ( c 2 ) t 2 . s e t N a m e ( " t 2 " ) t 1 . s t a r t ( ) t 2 . s t a r t ( ) } } c l a s s C r e d i a r i o i m p l e m e n t s R u n n a b l e { p u b l i c v o i d r u n ( ) { C l i e n t e c = C l i e n t e . g e t I n s t a n c e ( ) S y s t e m . o u t . p r i n t l n ( " I n i c i a n d o t r a n s a c a o d e c r e d i a r i o . . . " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) + " " + c . t o S t r i n g ( ) ) c . a n a l i s a r F i c h a ( ) } }

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

7/12

15/02/13

Cap. 9 - Threads (Segmentos) - Java Free.org

c l a s s C l i e n t e { p r i v a t e s t a t i c C l i e n t e s i n g l e t o n p u b l i c s t a t i c C l i e n t e g e t I n s t a n c e ( ) { i f ( s i n g l e t o n = = n u l l ) s i n g l e t o n = n e w C l i e n t e ( ) r e t u r n s i n g l e t o n } s y n c h r o n i z e d v o i d a n a l i s a r F i c h a ( ) { t r y { T h r e a d . s l e e p ( 5 0 0 ) S y s t e m . o u t . p r i n t l n ( " A n a l i s a n d o f i c h a . . . . " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) ) T h r e a d . s l e e p ( 5 0 0 ) l i b e r a r F i c h a ( ) } c a t c h ( E x c e p t i o n e ) { } } s y n c h r o n i z e d v o i d l i b e r a r F i c h a ( ) { t r y { T h r e a d . s l e e p ( 5 0 0 ) S y s t e m . o u t . p r i n t l n ( " L i b e r a n d o f i c h a . . . . " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) ) } c a t c h ( E x c e p t i o n e ) { } } }

Vejamos um exemplo em que dois mtodos so sincronizados e um no, e observe que pelo resultado nenhum problema h quando se chama um mtodo sem sincronizamesmonocasodoobjetoestarbloqueado:

p u b l i c c l a s s T e s t { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { C r e d i a r i o c 1 = n e w C r e d i a r i o ( ) C r e d i a r i o c 2 = n e w C r e d i a r i o ( ) N e g a t i v a c a o n 1 = n e w N e g a t i v a c a o ( ) T h r e a d t 1 = n e w T h r e a d ( c 1 ) t 1 . s e t N a m e ( " t 1 " ) T h r e a d t 2 = n e w T h r e a d ( c 2 ) t 2 . s e t N a m e ( " t 2 " ) T h r e a d t 3 = n e w T h r e a d ( n 1 ) t 3 . s e t N a m e ( " t 3 " ) t 1 . s t a r t ( ) t 2 . s t a r t ( ) t 3 . s t a r t ( ) } } c l a s s C r e d i a r i o i m p l e m e n t s R u n n a b l e { p u b l i c v o i d r u n ( ) { C l i e n t e c = C l i e n t e . g e t I n s t a n c e ( ) S y s t e m . o u t . p r i n t l n ( " I n i c i a n d o t r a n s a c a o d e c r e d i a r i o . . . " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) + " " + c . t o S t r i n g ( ) ) c . a n a l i s a r F i c h a ( ) } } c l a s s N e g a t i v a c a o i m p l e m e n t s R u n n a b l e { p u b l i c v o i d r u n ( ) { C l i e n t e c = C l i e n t e . g e t I n s t a n c e ( ) S y s t e m . o u t . p r i n t l n ( " I n i c i a n d o t r a n s a c a o d e n e g a t i v a c a o . . . " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) + " " + c . t o S t r i n g ( ) ) c . n e g a t i v a r ( ) } } c l a s s C l i e n t e { p r i v a t e s t a t i c C l i e n t e s i n g l e t o n p u b l i c s t a t i c C l i e n t e g e t I n s t a n c e ( ) { i f ( s i n g l e t o n = = n u l l ) s i n g l e t o n = n e w C l i e n t e ( ) r e t u r n s i n g l e t o n } s y n c h r o n i z e d v o i d a n a l i s a r F i c h a ( ) { t r y { T h r e a d . s l e e p ( 5 0 0 ) S y s t e m . o u t . p r i n t l n ( " A n a l i s a n d o f i c h a . . . . " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) ) T h r e a d . s l e e p ( 5 0 0 ) l i b e r a r F i c h a ( ) } c a t c h ( E x c e p t i o n e ) { } } s y n c h r o n i z e d v o i d l i b e r a r F i c h a ( ) { t r y { T h r e a d . s l e e p ( 5 0 0 ) S y s t e m . o u t . p r i n t l n ( " L i b e r a n d o f i c h a . . . . " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) ) }

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

8/12

15/02/13

Cap. 9 - Threads (Segmentos) - Java Free.org

c a t c h ( E x c e p t i o n e ) { } } v o i d n e g a t i v a r ( ) { t r y { T h r e a d . s l e e p ( 5 0 0 ) S y s t e m . o u t . p r i n t l n ( " N e g a t i v a n d o f i c h a . . . . " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) ) } c a t c h ( E x c e p t i o n e ) { } } }

Resultado: Iniciandotransacaodecrediario...t2Cliente@ba34f2 Iniciandotransacaodenegativacao...t3Cliente@ba34f2 Iniciandotransacaodecrediario...t1Cliente@ba34f2 Analisandoficha....t2 Negativandoficha....t3 Liberandoficha....t2 Analisandoficha....t1 Liberandoficha....t1 Notequeoprocessodenegativaoseprocessoumesmonoterminandooprocessodecredirio. Agoravamossincronizaromtodosincronizaoparaveroqueacontece: Iniciandotransacaodecrediario...t1Cliente@ba34f2 Iniciandotransacaodenegativacao...t3Cliente@ba34f2 Iniciandotransacaodecrediario...t2Cliente@ba34f2 Analisandoficha....t1 Liberandoficha....t1 Negativandoficha....t3 Analisandoficha....t2 Liberandoficha....t2 Note que agora o processo de nativao (mtodo negativar) s se procedeu aps o trmino do processo de liberao. Uso nos leva a pensar em uma situao inesperada:oimpasse.....vejamosnoitemseguinte: 9.10Deadlock(impasse) Essa uma situao em que duas thread ficam esperando um bloqueio, ou seja, a thread A fica aguardando o bloqueio que est sob bloqueio da thread B e a thread B est aguardando o bloqueio que est em possa da thread A, uma situao assim ocasionar em um travamento do sistema. Embora no seja uma situaocomum,quandoocorreosistemaficaparalizadoealmdissonomuitofcilencontraroproblema. Ocdigoaseguirmostraumexemplobemsimplesdeumdeadlock:

p u b l i c c l a s s T e s t D e a d L o c k { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { C r e d i a r i o c 1 = n e w C r e d i a r i o ( ) N e g a t i v a c a o n 1 = n e w N e g a t i v a c a o ( ) T h r e a d t 1 = n e w T h r e a d ( c 1 ) t 1 . s e t N a m e ( " t 1 " ) T h r e a d t 2 = n e w T h r e a d ( n 1 ) t 2 . s e t N a m e ( " t 2 " ) t 1 . s t a r t ( ) t 2 . s t a r t ( ) } } c l a s s C r e d i a r i o i m p l e m e n t s R u n n a b l e { p u b l i c v o i d r u n ( ) { C l a s s 1 . m 1 ( ) } } c l a s s N e g a t i v a c a o i m p l e m e n t s R u n n a b l e { p u b l i c v o i d r u n ( ) { C l a s s 2 . m 1 ( ) } } c l a s s C l a s s 1 { s t a t i c s y n c h r o n i z e d v o i d m 1 ( ) { t r y { T h r e a d . s l e e p ( 5 0 0 ) S y s t e m . o u t . p r i n t l n ( " e x e c u t a n d o c l a s s 1 m 1 " ) C l a s s 2 . m 2 ( ) } c a t c h ( E x c e p t i o n e ) { } } s t a t i c s y n c h r o n i z e d v o i d m 2 ( ) { t r y {

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

9/12

15/02/13

Cap. 9 - Threads (Segmentos) - Java Free.org

T h r e a d . s l e e p ( 5 0 0 ) S y s t e m . o u t . p r i n t l n ( " e x e c u t a n d o c l a s s 1 m 2 " ) } c a t c h ( E x c e p t i o n e ) { } } } c l a s s C l a s s 2 { s t a t i c s y n c h r o n i z e d v o i d m 1 ( ) { t r y { T h r e a d . s l e e p ( 5 0 0 ) S y s t e m . o u t . p r i n t l n ( " e x e c u t a n d o c l a s s 2 m 1 " ) C l a s s 1 . m 2 ( ) } c a t c h ( E x c e p t i o n e ) { } } s t a t i c s y n c h r o n i z e d v o i d m 2 ( ) { t r y { T h r e a d . s l e e p ( 5 0 0 ) S y s t e m . o u t . p r i n t l n ( " e x e c u t a n d o c l a s s 2 m 2 " ) } c a t c h ( E x c e p t i o n e ) { } } }

9.11Interaoentresegmentos Eventualmente voc precisar notificar um segmento que B que o segmento A finalizou sua tarefa, fazendo com que o segmento B possa entrar em estado de executvelparasecandidataraexecutar. AclasseObjectdefinetrsmtodospararealizaodessainterao,soeles:

wait() notify() notifyAll() S um lembrete: como esses mtodos so definidos na classe Object, todos os demais objetos tem esses mtodos, at mesmo a classe Thread, portanto no vacile...... ElesSEMPREdevemserchamadosdeumcontextosincronizados. Um exemplo bem prtico para esse recurso pode ser visto no trecho abaixo, pois uma thread de leitura aguarda a criao de um arquivo que gerado por outra thread,vejamosocdigo:

i m p o r t j a v a . i o . * p u b l i c c l a s s I n t e r a T h r e a d { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { t r y { A r q u i v o a r q = n e w A r q u i v o ( n e w F i l e ( " s a i d a . t x t " ) ) T h r e a d [ ] a = n e w T h r e a d [ 2 0 ] f o r ( i n t i = 0 i < a . l e n g t h i + + ) { a [ i ] = n e w T h r e a d ( n e w L e i t u r a ( a r q ) ) a [ i ] . s e t N a m e ( " " + i ) a [ i ] . s t a r t ( ) } T h r e a d b = n e w T h r e a d ( n e w G r a v a c a o ( a r q ) ) b . s t a r t ( ) b . j o i n ( ) S y s t e m . o u t . p r i n t l n ( " P r o c e s s o f i n a l i z a d o . . . " ) } c a t c h ( E x c e p t i o n e x ) { } } } c l a s s G r a v a c a o i m p l e m e n t s R u n n a b l e { A r q u i v o a r q p u b l i c G r a v a c a o ( A r q u i v o v a l u e ) { a r q = v a l u e } p u b l i c v o i d r u n ( ) { a r q . g r a v a r ( ) } } c l a s s L e i t u r a i m p l e m e n t s R u n n a b l e { A r q u i v o a r q p u b l i c L e i t u r a ( A r q u i v o v a l u e ) { a r q = v a l u e } p u b l i c v o i d r u n ( ) { a r q . l e r ( )

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

10/12

15/02/13

Cap. 9 - Threads (Segmentos) - Java Free.org

} } c l a s s A r q u i v o { F i l e f i l e p u b l i c A r q u i v o ( F i l e v a l u e ) { f i l e = v a l u e } s y n c h r o n i z e d p u b l i c v o i d l e r ( ) { t r y { i f ( ! f i l e . e x i s t s ( ) ) { w a i t ( ) } S y s t e m . o u t . p r i n t ( " t h r e a d # " + T h r e a d . c u r r e n t T h r e a d ( ) . g e t N a m e ( ) + " > > > " ) i f ( f i l e . e x i s t s ( ) ) { F i l e I n p u t S t r e a m f i s = n e w F i l e I n p u t S t r e a m ( f i l e ) i n t i n w h i l e ( ( i n = f i s . r e a d ( ) ) ! = 1 ) { S y s t e m . o u t . p r i n t ( ( c h a r ) i n ) } f i s . c l o s e ( ) } } c a t c h ( E x c e p t i o n e ) { e . p r i n t S t a c k T r a c e ( ) } } s y n c h r o n i z e d p u b l i c v o i d g r a v a r ( ) { t r y { i f ( ! f i l e . e x i s t s ( ) ) { F i l e O u t p u t S t r e a m f o s = n e w F i l e O u t p u t S t r e a m ( f i l e ) f o r ( i n t i = 0 i < 5 i + + ) { f o s . w r i t e ( ( " l i n h a " + i ) . g e t B y t e s ( ) ) } f o s . w r i t e ( " \ n " . g e t B y t e s ( ) ) f o s . c l o s e ( ) S y s t e m . o u t . p r i n t ( " E n t r o u n o n o t i f y " ) n o t i f y ( ) } } c a t c h ( E x c e p t i o n e ) { e . p r i n t S t a c k T r a c e ( ) } } }

Comovocpodenotar,ocdigoacimadispara10threadparaleituradeumarquivoquemuitoprovavelmentenemtenhasidocriado,portantoasthreadentramno estadowaitatqueathreadcrieoarquivoliberandoparaaleitura.

Bom,achoqueterminamosoquepodemosdefinircomooPIORcaptulodesseguia,portantoagorarevisetodososcaptuloeBOASORTE!!!

Leiatambm: FundamentosdaLinguagem Modificadores Operadoreseatribuies ControledeFluxo OrientaoaObjetos JavaLangeWrappers ObjetoseConjuntos ClassesInternas Threads(Segmentos)

comentrios:3

TpicosRelacionados
ReuniodogrupodeestudosSCJP11/12/2004 ReuniodogrupodeestudosSCJP30/10/04 Opniaosobrelivros? CollectionFramework HibernateemAo

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

11/12

15/02/13
ComointegrarSpringcomHibernate? dvida,notify()enotifyAll()...

Cap. 9 - Threads (Segmentos) - Java Free.org

AlguemsabemfazercomunicaoentreThreads?? comofuncionasincronized???

Home Sobre Anuncie OJavaFree.orgumacomunidadejavaformadapelacoolaboraodosdesenvolvedoresdatecnologiajava.A publicaodeartigosalmdeajudaracomunidadejava,ajudaadarmaiorvisibilidadeparaoautor.Contribuaconosco.

RSSNotcias RSSFrum

javafree.uol.com.br/artigo/6955/Cap-9-Threads-Segmentos.html

12/12

You might also like