Você está na página 1de 12

Threads em Java Miguel Jonathan- DCC/IM e NCE/UFRJ

atualizado em 16/11/2011

Conceitos: Diferena entre processo e thread: Um processo um programa em exe u!o "ue po##ui o #eu pr$prio e#pao %e en%ereamento& Um #i#tema opera ional multitarefa apa' %e ontrolar a exe u!o %e mai# %e um pro e##o ao me#mo tempo( %e forma on orrente( fa'en%o a C)U alternar a exe u!o %a# in#tru*e# %e a%a pro e##o& Uma thread um fluxo #e"uen ial %e ontrole( ou linha de execuo, %entro %e um pro e##o ou programa& Um pro e##o po%e a##im ter %i+er#a# threa%# exe utan%o on orrentemente( ma# to%a# partilhan%o o me#mo e#pao %e en%ereamento& Como n!o h, ne e##i%a%e %e tro ar %e ontexto( a# threa%# repre#entam uma forma mai# le+e %e pro e##amento on orrente& - M,"uina .irtual Ja+a /J.M0 permite "ue uma apli a!o tenha %i+er#a# linha# %e exe u!o ro%an%o on orrentemente& 1, #empre pelo meno# uma threa%( "ue ro%a o mto%o main/0& E##a threa% ria%a automati amente( e outra# po%em #er ria%a# pelo programa%or& 2 programa g /garbage collector0 ro%a em outra threa% tam3m ini ia%a pela J.M& Porque usar threads em aplicaes: 4hrea%# t5m +,ria# utili%a%e#( e#pe ialmente "uan%o o u#o %e um re ur#o %o programa po%e %eman%ar muito tempo( e tra+ar outra# tarefa# "ue e#t!o aguar%an%o( ou "uan%o #e pre i#a fi ar +erifi an%o a o orr5n ia %e algum e+ento para efetuar alguma a!o& Ne##e 6ltimo a#o( uma threa% po%e fi ar %e%i a%a apena# para +erifi ar perio%i amente a o orr5n ia %o e+ento& - apli a!o mai# u#ual a intera!o om a# interfa e# gr,fi a# /menu#( 3ot*e#0 "uan%o #e "uer o3ter re#po#ta "ua#e "ue ime%iata a uma a!o& A classe java.lang.Thread: Em Ja+a( a%a threa% implementa%a omo um o37eto( "ue %e+e #er uma in#t8n ia %e uma #u3 la##e %e java.lang.Thread ria%a para e##e fim& A interface java.lang.Runna le E##a interfa e o3riga a ter o mto%o public void run()& 4o%a threa% ria%a para exe utar o# oman%o# %e algum mto%o om e##a a##inatura& - pr$pria la##e 4hrea% po##ui e##e mto%o( ma# +a'io( ou #e7a( n!o fa' na%a& Como criar uma thread: 1, %ua# forma# 3,#i a# para #e riar uma threa%: a) Criar uma #u3 la##e expl9 ita %e java.lang.Thread( e re%efinir o mto%o run() om o# oman%o# "ue a threa% %e+er, exe utar& Ex: class MinhaThread extends Thread{ public void run(){ <instrues da thread> } } - partir %a9 po##9+el riar "uanta# in#t8n ia# #e %e#e7ar %e##a la##e& Ca%a +e' "ue en+iar a men#agem start() para uma in#t8n ia( uma no+a linha %e exe u!o #er, ini ia%a om o# oman%o# %o mto%o run()( "ue ro%ar, em paralelo om a# outra# threa%#: MinhaThread t t.start()" ne! MinhaThread()"

ou( #imple#mente: ne! MinhaThread().start()"

Note "ue n!o #e po%e en+iar a men#agem run/0 %iretamente para um o37eto 4hrea%& En+ia-#e a men#agem #tart/0( "ue riar, a threa% on%e ro%ar!o o# oman%o# %o mto%o run/0& 23#: 4hrea%# po%em #er ria%a# #em refer5n ia expl9 ita( omo na forma mai# #imple# a ima / ex: ne! MinhaThread().start()"0 ( #em ri# o %e #erem remo+i%a# pelo :ar3age Colle tor( poi# po##uem uma refer5n ia interna "ue permane e at o mto%o run() a##o ia%o terminar&

b) - #egun%a forma %e riar threa% re omen%a%a em #itua*e# on%e "ueremo# exe utar um
mto%o %e uma la##e "ual"uer em uma threa% #epara%a( #em "ue e##a la##e her%e %e Thread. I##o ne e##,rio no a#o %a la##e 7, #er uma #u3 la##e %e outra( poi# n!o po%eria her%ar tam3m %e Thread. Ne##e a#o( fa'emo# a la##e em "ue#t!o implementar a interfa e #unnable e olo amo# no mto%o public void run() o# oman%o# "ue #er!o exe uta%o# na threa%& No exemplo a3aixo( um mto%o run/0 %a la##e ; #er, olo a%o em uma threa%: class $ i%ple%ents #unnable{ public void run(){ <instrues da thread> } ..... outros %&todos de $' construtores' atributos' etc } - #eguir( em outro mto%o( riamo# uma in#t8n ia %e ;( e pa##amo# a in#t8n ia omo argumento %o on#trutor %a la##e 4hrea%: $ x ne! $(...)" Thread t ne! Thread(x)" 2 efeito %i##o a ria!o %e uma in#t8n ia %e 4hrea% "ue exe utar, o mto%o run/0 %efini%o na la##e %o argumento %o on#trutor& En+ian%o a #eguir a men#agem start() para a threa% far, ini iar uma no+a linha %e exe u!o om o# oman%o# %o mto%o run() %a la##e ;( "ue ro%ar, em paralelo om a# outra# threa%#& t.start()" !ome da thread: 4o%a threa% tem um nome /uma #tring0 para po%er #er i%entifi a%a& 2 nome po%e #er pa##a%o omo um par8metro %o on#trutor( e po%e #er re upera%o en+ian%o para a threa% a men#agem get(a%e(). <e um nome n!o for e#pe ifi a%o no on#trutor( um no+o nome #er, gera%o automati amente para a threa%& Como in luir o nome na hama%a %o on#trutor: ))subclasse explicita de Thread* Thread t+ ne! MinhaThread(,Thread +,)" )) usando instancia de classe $ -ue i%ple%enta #unnable* Thread t. ne! Thread(ne! $()' ,Thread .,)" Prioridade: Ca%a threa% po##ui uma prioridade. 4hrea%# om priori%a%e# mai# ele+a%a# #!o exe uta%a# preferen ialmente ante# %e threa%# om menor priori%a%e& - priori%a%e default = /em uma e# ala %e > a >?0( ma# po%e #er altera%a en+ian%o a men#agem set/riorit0(int) para a threa%& /Nota: na la##e 4hrea% exi#tem a# on#tante# static M1$2/#34#3T5, M3(2/#34#3T5 e (4#M2/#34#3T5( om +alore# >?( ? e =( ma# "ue po%em +ariar %epen%en%o %a implementa!o0&

@uan%o exi#tem %i+er#a# threa%# %e me#ma priori%a%e #en%o exe uta%a#( Ja+a alo a um tempo m,ximo para pro e##ar o# oman%o# %e a%a uma( ap$# o "ue interrompe a threa% em exe u!o e pa##a a pro e##ar o# oman%o# %a #eguinte& " m#todo de classe Thread.currentThread(): E##e mto%o permite a e##ar a threa% "ue e#t, exe utan%o no momento em "ue hama%o& A u#a%o %entro %o mto%o run/0 para permitir i%entifi ar e/ou alterar o# par8metro# %a threa% /lem3re-#e "ue o run/0 po%e #er %e outra la##e0& )or exemplo( para imprimir o nome %a threa% on%e e##e oman%o e#t, exe utan%o: 60ste%.out.println(Thread.currentThread().get(a%e())" $a%endo uma thread &dormir' por um certo tempo: 2 mto%o %e la##e Thread.sleep(long %ilisseg) permite interromper a exe u!o %a threa% pelo tempo %a%o no argumento& De+e #er u#a%o %entro %e um 3lo o tr0 por"ue( a#o a threa% re e3a uma men#agem interrupt() en"uanto e#ti+er para%a por um sleep()( #er, lana%a uma 3nterrupted7xception. Cedendo o tempo de processamento para outras threads: Uma threa% po%e e%er o re#tante %o tempo %e pro e##amento alo a%o a ela( exe utan%o o oman%o 0ield()& 2 ontrole pa##a para a pr$xima threa% "ue e#ti+er aguar%an%o& E+ita %e#per%iar tempo %e pro e##amento& ()emplos: 2# exemplo# a3aixo #imulam uma orri%a entre %oi# time#( Flamengo e Botafogo& Ne#te# %oi# exemplo#( %ua# threa%# e# re+em Cem paraleloD na on#ole o# n6mero# %e > a EE( #egui%o %o nome %o time& 1. No primeiro exemplo( uma #u3 la##e %e 4hrea% %efini%a( on%e o #eu mto%o run/0 #imula a orri%a& Dua# in#t8n ia# %e##a la##e #!o ria%a# para repre#entar o# %oi# 7oga%ore#& Ca%a threa% re e3e o nome %e um time /Flamengo e Botafogo0 pa##a%o pelo on#trutor& )ara tornar o re#ulta%o aleat$rio( e po##i3ilitar uma melhor o3#er+a!o %o# re#ulta%o#( a%a threa% C%ormeD uma "uanti%a%e aleat$ria %e mili#egun%o# entre ? e FEE ante# %e imprimir a pr$xima linha& )ara i##o u#a%o o mto%o e#t,ti o #leep/long mili#eg0 %a la##e 4hrea%& -nte# %e terminar( a%a threa% imprime a pala+ra 4ERMIN2U( #egui%o %o #eu nome& 2 mto%o get(a%e() %a la##e Thread retorna a #tring om o nome&
public class Thread6i%ples extends Thread { public Thread6i%ples(6tring str) { super(str)" } public void run() { 8or (int i 9" i < +99" i::) { 60ste%.out.println(i : , , : get(a%e())" tr0 { sleep((long)(Math.rando%() ; <99))" } catch (3nterrupted7xception e) {} } 60ste%.out.println(,T7#M3(4= , : get(a%e():,>,)" } } public class Teste?uasThreads { public static void %ain (6tring@A args) { Thread6i%ples bota ne! Thread6i%ples(,B4T1C4D4,)" bota.set/riorit0(E)" Thread6i%ples %engo ne! Thread6i%ples(,CF1M7(D4,)" %engo.set/riorit0(G)" %engo.start()"

bota.start()" 60ste%.out.println(,Main ter%inado>,)" } }

F&

2 #egun%o exemplo e##en ialmente o me#mo "ue o primeiro( #$ "ue ne##e a#o n!o #e ria nenhuma #u3 la##e %e 4hrea%& Em +e' %i##o uma la##e 4ime %efini%a( "ue implementa a interfa e Runna3le& 2 mto%o run/0 %e 4ime ontm o# me#mo# oman%o# "ue o mto%o run/0 %a #u3 la##e %e 4hrea% %o primeiro exemplo& Ne##e a#o( a priori%a%e %e a%a threa% pa##a%a pelo on#trutor %o time&
public class Ti%e implements #unnable { 6tring no%e" int priorit0" public Ti%e(6tring no%e' int priorit0) { this.no%e no%e" this.priorit0 priorit0" } public void run() { Thread.currentThread().set/riorit0(priorit0)" for (int i 9" i < +99" i::) { 60ste%.out.println(i : ,# , : no%e)" try { Thread.sleep((long)(Math.random() ; <99))" } catch (3nterrupted7xception e) {} } 60ste%.out.println(,T7#M3(4= , : no%e:,>,)" }

}
public class Teste?uasThreads { public static void %ain (6tring@A args) { Ti%e bota Ti%e %engo new Ti%e(,B4T1C4D4,'+)" new Ti%e(,CF1M7(D4,'H)"

new Thread(%engo).start()" new Thread(bota).start()" 60ste%.out.println(,Main ter%inado>,)" } }

*nterrup+o de uma Thread 4o%a threa% tem uma +ari,+el interna( um flag 3in,rio( "ue ontm o #eu Ge#ta%o %e interrup!oG /interrupt status0& E##e flag fi a G#eta%oG( ou #e7a( +alen%o >( #e a threa% re e3eu uma #oli ita!o para #er interrompi%a( por meio %a men#agem interrupt()& E##a men#agem n!o para a threa% automati amente& - pr$pria threa% %e+e a+aliar o "ue fa'er e omo #e terminar& 2 a#o t9pi o a threa% fa'er alguma finali'a!o e exe utar return( para #e terminar& Ca#o a threa% e#te7a 3lo"uea%a temporariamente por ter exe uta%o um sleep()( join() ou !ait()( ela re e3er, tam3m uma 3nterrupted7xception ao re e3er a men#agem interrupt()& Ne##e a#o( #er, o3rigat$rio ha+er 3lo o# trH- at h para e##a ex e!o +erifi a%a( e o 3lo o at h po%er, fa'er o tratamento %a interrup!o& A I a#o %o primeiro exemplo mo#tra%o a #eguir& No a#o %a threa% n!o in luir oman%o# "ue po%em lanar 3nterrupted7xception( a threa% po%e he ar #e o #eu #tatu# %e interrup!o foi G#eta%oG por meio %e uma hama%a ao mto%o static boolean interrupted()%a la##e 4hrea%& E##e mto%o %e la##e +erifi a o #tatu# %a

threa% "ue e#t, exe utan%o /a current thread0( retornan%o true #e o #tatu# for >( e fal#e em a#o ontr,rio& - exe u!o %e##e mto%o tam3m Cre##etaD automati amente o #tatu# %e interrup!o para 'ero& Exemplo#: -# la##e# a3aixo mo#tram o u#o %e interrup!o no# %oi# a#o#& Uma threa% #epara%a %a threa% %ain() fi a imprimin%o in%efini%amente na on#ole o# m6ltiplo# %e um +alor rai'& impre##!o %e+e #er interrompi%a "uan%o a te la EN4ER %o te la%o for a iona%a %entro %o mto%o main& -# la##e# %e+em #er u#a%a# ao# pare#& 2 mto%o %ain() %i#para a threa% e fi a aguar%an%o a entra%a %o te la%o( om o oman%o br.readFine()& Em #egui%a( en+ia para a threa% a men#agem interrupt()& No primeiro a#o( a threa% u#a o mto%o Thread.sleep(+) para G%ormirG > mili##egun%o entre a%a impre##!o& 2 3lo o at h pega a interrup!o e termina a threa% om return& No #egun%o a#o( n!o u#a%o o sleep()( e por i##o n!o exi#tem 3lo o# trH- at h para %ete tar a interrup!o& 2 mto%o Thread.interrupted() u#a%o para he ar( a a%a +olta %o lao %e impre##!o( #e o #tatu# %e interrup!o mu%ou para >& a0 Interrup!o %e threa% por meio %e 3nterrupted7xception /threa% tem sleep()0:
public class 3%pri%eThreadIo%6leep extends Thread{ private int raiJ" public 3%pri%eThreadIo%6leep(int raiJ){ this.raiJ raiJ" } public void run(){ int i +" int n raiJ" while(true){ 60ste%.out.println(n raiJ;i)" i::" try{ sleep(+)" } catch(3nterrupted7xception e){ 60ste%.out.println (,Thread interro%pida en-uanto dor%ia>,)" return" )) ter%ina a thread } } } } import java.io.;" public class 3nterro%peThread+ { public static void %ain(6tring@Aargs){ 3%pri%eThreadIo%6leep t" if (args.length < +){ 60ste%.out.println(,7ste progra%a necessita de u% argu%ento inteiro' a raiJ,)" return" } else { try{ int raiJ 3nteger.parseInt(args@9A)" t new 3%pri%eThreadIo%6leep(raiJ)" t.start()" }catch((u%berCor%at7xception n8){ 60ste%.out.println(,7ste progra%a necessita de u% argu%ento inteiro,)" return" }

} Bu88ered#eader br new Bu88ered#eader(new 3nput6trea%#eader(60ste%.in))" try{ br.readFine()" )) aguarda digitar 7(T7# } catch (347xception e) {} t.interrupt()" } )) %ain ter%ina }

30 Interrup!o %e threa% por meio %e Thread.interrupted() /threa% #em sleep()0:


public class 3%pri%eThread6e%6leep extends Thread { private int raiJ" public 3%pri%eThread6e%6leep(int raiJ) { this.raiJ raiJ" } public void run() { int i +' n raiJ" while (true) { 60ste%.out.println(n raiJ ; i)" i::" if (Thread.interrupted()) { 60ste%.out.println(,Thread interro%pida se% estar dor%indo>,)" return" } } } } import java.io.;" public class 3nterro%peThread. { public static void %ain(6tring@Aargs){ 3%pri%eThread6e%6leep t" if (args.length < +){ 60ste%.out.println(,7ste progra%a necessita de u% argu%ento inteiro' a raiJ,)" return" } else { try{ int raiJ 3nteger.parseInt(args@9A)" t new 3%pri%eThread6e%6leep(raiJ)" t.start()" } catch((u%berCor%at7xception n8){ 60ste%.out.println(,7ste progra%a necessita de u% argu%ento inteiro,)" return" } } Bu88ered#eader br new Bu88ered#eader(new 3nput6trea%#eader(60ste%.in))" try{ br.readFine()" )) aguarda digitar 7(T7# } catch (347xception e) {} t.interrupt()" })) %ain ter%ina }

,so Concorrente de Recursos Con#i#te na tentati+a %e u#o #imult8neo %e um re ur#o por mai# %e um pro e##o: ex: %oi# arro# tentan%o e#ta ionar na me#ma +aga( %ua# pe##oa# tentan%o pa##ar pela me#ma porta( %oi# pro e##o# tentan%o imprimir na me#ma impre##ora( %ua# threa%# tentan%o a e##ar uma me#ma ,rea %a mem$ria& A importante e+itar e##a# G oli#*e#G& A pre i#o ent!o garantir "ue um re ur#o fi ar, %i#pon9+el para a e##o por apena# uma threa% %e a%a +e'& I##o

on#egui%o em Ja+a mar an%o( om uma #inali'a!o %e Gtran aG ou Glo JG( a parte %e $%igo em "ue a threa% fa' u#o %e um re ur#o partilha%o om outra# threa%#& 2 aten%imento K# threa%# "ue %i#putam um me#mo re ur#o n!o feito exatamente na forma %e uma fila %e e#pera( poi# o e# alona%or %a J.M n!o muito %etermin9#ti o( em3ora po##a #eguir #uge#t*e# %a%a# por oman%o# omo 0ield() e set/riorit0()& Ja+a u#a o me ani#mo %e #em,foro#& -em.foro /ou monitor( lo J/tran a0 e a pala+ra- ha+e synchronized& Um #em,foro um #inali'a%or a##o ia%o a um re ur#o "ue monitora%o para #er u#a%o por uma 6ni a threa% %e a%a +e'& 2 re ur#o #empre a##o ia%o a um o37eto& 4o%o o37eto em Ja+a ontm uma 6ni a Gtran aG( "ue partilha%a por to%o# o# mto%o# #in roni'a%o# %e##e o37eto&& <e o +alor %o #em,foro for 'ero( o o37eto e#t, %i#pon9+el& Em Ja+a( e##e me ani#mo implementa%o om o u#o %a pala+ra- ha+e #Hn hroni'e% para prefixar um mto%o "ue %e+e ro%ar em uma threa% om u#o ex lu#i+o %o o37eto "ue ati+ou o mto%o& Uma threa%( ao entrar em um mto%o #in roni'a%o %e um o37eto( toma po##e e in rementa o #em,foro %o o37eto( impe%in%o outra# threa%# %e entrarem em outro# mto%o# #in roni'a%o# %a me#ma la##e( at a threa% "ue %etm a tran a terminar %e exe utar o mto%o& -o #air %e um mto%o #in roni'a%o( a threa% %e rementa o #em,foro %o o37eto( "ue fi ar, li3era%o para u#o por outra# threa%# #in roni'a%a#( "uan%o o +alor %o #em,foro +oltar a 'ero /uma me#ma threa%( ap$# a%"uirir o #em,foro %e um o37eto( po%e entrar em +,rio# mto%o# #in roni'a%o# %o me#mo o37eto( e a%a +e' "ue i##o o orre o #em,foro #er, in rementa%o mai# uma +e'0& @uan%o uma threa% exe uta um mto%o #in roni'a%o m/0( "ue foi ati+a%o a partir %e um %etermina%o o37eto x( omo em x&m/0( o a e##o ao o37eto x fi a 3lo"uea%o a to%a# a# %emai# threa%# "ue tentarem exe utar e##e ou outro# mto%o# #in roni'a%o# %a la##e %e x( at "ue o mto%o m/0 termine e li3ere a tran a& )o%emo# tam3m re#tringir o a e##o a apena# um 3lo o %e $%igo %entro %e um mto%o( prefixan%o o 3lo o om a pala+ra s0nchroniJed( om um o37eto entre par5nte#e#: Ex: s0nchroniJed(x) { <bloco de cKdigo> } E##a on#tru!o o3riga a "ue a tran a %o o37eto x %e+a #er a%"uiri%a por uma threa% para exe utar o 3lo o( e en"uanto a tran a n!o for li3era%a por e##a threa%( nenhuma outra po%er, exe utar e##e 3lo o para e##e o37eto& Trancas de Classes: Cla##e# tam3m #!o o37eto#( e po##uem tran a#& - tran a %e uma la##e #e refere ao# #eu# mto%o# e#t,ti o# #in roni'a%o# /s0nchroniJed static0( e "uan%o uma threa% exe uta um mto%o e#t,ti o #in roni'a%o( o a e##o K# +ari,+ei# %e la##e fi a 3lo"uea%o para outra# threa%#& /i erando a tranca do o jeto com o !ait(): De %entro %e um mto%o ou 3lo o sincroni%ado( o en+io %a men#agem !ait()ao o37eto "ue ati+ou o mto%o /thi#0 #u#pen%e a exe u!o %a threa%( e li3era a tran a %e##e o37eto& - hama%a para !ait() po%e n!o ter argumento /forma mai# u#a%a( e#pera in%etermina%a0 ou ter um +alor %e tempo %e e#pera %etermina%o em mili##egun%o#& - exe u!o %o mto%o fi ar, #u#pen#a /e a threa% entra no e#ta%o 3lo"uea%o0 at "ue o tempo #e e#gote( ou at "ue uma outra threa% %i#pare um mto%o noti80() ou noti801ll()& Ne##e momento( a threa%

em e#pera a or%a e retoma ao e#ta%o Grunna3leG( pa##an%o a po%er re e3er tempo %e pro e##amento& 4ipi amente( e##a threa% aguar%a "ue uma on%i!o externa mu%e /em geral por onta %a a!o %e outra# threa%#0& Exemplo %e u#o %e threa%# om #in roni#mo (Adaptado de um exemplo de Paulo Csar M. Je eaux em !!!.portal"a a.com.br# Ne##e exemplo( um 3an o tem >? onta#& Ca%a onta ria%a om um +alor ini ial %e >?&??? reai#& <!o ent!o ria%a# >? threa%#( uma para a%a onta( e a# >? threa%# pa##am a exe utar #eu# mto%o# run() em paralelo( om igual priori%a%e& Ca%a threa% fi a ontinuamente tran#ferin%o uma "uantia aleat$ria /menor "ue =???0 para uma outra %a# E onta#( e# olhi%a tam3m aleatoriamente& Como n!o ha+er, %ep$#ito# ou #a"ue# externo#( o total %o %inheiro no 3an o /a #oma %o# #al%o# %a# >? onta#0 %e+eria fi ar on#tante em >??&??? reai#& )ara fa'er uma tran#fer5n ia( a%a threa% exe uta %ua# opera*e# em #e"u5n ia( em um mto%o trans8ere(): a0 tenta %e3itar %a #ua onta /#e hou+er #al%o0 uma "uantia %e %inheiro e# olhi%a aleatoriamente( at =??? reai#L e 30 ap$# on#eguir %e3itar( re%ita a me#ma "uantia em outra onta e# olhi%a tam3m aleatoriamente& -# %ua# a*e# on7unta#( %3ito %e uma onta( e r%ito na outra onta( formam o "ue #e hama uma transao at$mica( no #enti%o %e "ue %e+e #er indi is% el& 2u #e7a( ela n!o %e+e #er interrompi%a no meio( ante# "ue outra# a*e# manipulem /leiam ou alterem0 o# +alore# %a# onta#( ou re#ulta%o# e#tranho# po%em o orrer( omo +eremo# a #eguir& Ca%a threa% entra num lao em "ue te#ta #e a onta tem #al%o #ufi iente para %e3itar a "uantia a tran#ferir e( n!o ten%o( C%ormeD por = mili#egun%o# ante# %e te#tar no+amente& i%eia "ue( em algum momento( %ep$#ito# ter!o #i%o feito# aleatoriamente "ue le+em o #al%o a #er #ufi iente para reali'ar a tran#fer5n ia& E##e exemplo tem %ua# +er#*e#: >0 Na primeira +er#!o( #em #in roni'a!o( n!o h, garantia "ue o mto%o trans8ere() ompletar, a# %ua# tran#fer5n ia# ante# "ue outra threa% po##a a e##ar a ,rea %e mem$ria %a# onta# %o 3an o: Ne#ta +er#!o( a# >? threa%# ompetem por i lo# %e C)U #em "ual"uer re#tri!o para a e##ar o# +alore# %a# onta#& 2 orre "ue a m,"uina +irtual Ja+a /J.M0 po%e a "ual"uer momento interromper a exe u!o %e uma threa% e pa##ar o ontrole para outra( e#tan%o e##a exe u!o em "ual"uer in#tru!o /3a#ta ter termina%o a exe u!o %e um 3Hte o%e0& Ne##a +er#!o( po%e o orrer "ue uma ou mai# tran#a*e# n!o tenham termina%o /%igamo#( #$ foi feito o %3ito( ma# ain%a n!o foi feito o r%ito #u3#e"uente0 ante# %e pa##ar o ontrole para outra threa% "ue al ula a #oma %o# +alore# %a# onta#& E+i%entemente "ue( ne##e a#o( a #oma po%er, %ar um re#ulta%o erra%o( poi# %e+eria #er feita #omente %epoi# "ue to%o# o# r%ito# forem reali'a%o#& F0 Na #egun%a +er#!o( foramo# "ue o mto%o trans8ere() %a la##e Ban o tenha "ue #er reali'a%o ompletamente /%e forma atMmi a0 por uma threa%( ante# %e permitir "ue outra threa% po##a a##umir o ontrole %o re ur#o manipula%o( no a#o o +etor %a# onta#& I##o feito prefixan%o o mto%o om a pala+ra- ha+e synchronized& Durante a exe u!o %e um

mto%o #in roni'a%o( a partir %a hama%a por um o37eto( omo em b.trans8ere()( a threa% pa##a a Cpo##uir o monitorD /a tran a( ou loc&0 %o o37eto "ue ati+ou o mto%o( no a#o o 3an o 3& I##o #ignifi a "ue #omente e##a threa% po%e a e##ar +ari,+ei# %e in#t8n ia ou %e la##e %e##e o37eto( at "ue termine( ou li3ere +oluntariamente o monitor om uma hama%a %e !ait()& Dentro %e um mto%o #in roni'a%o( a#o o orra a ne e##i%a%e %e aguar%ar algum tempo para ini iar a tran#a!o atMmi a( e para n!o manter a# %emai# threa%# e#peran%o( po##9+el en+iar o oman%o !ait() para o o37eto "ue ati+ou e##e mto%o& 2 efeito 3lo"uear e##a threa% e li3erar o monitor / i&e&( a tran a0 para "ue o e# alona%or %e tarefa# e# olha outra threa% para a##umi-lo& - threa% fi ar, 3lo"uea%a at "ue o o37eto re e3a a men#agem noti80() ou noti801ll()( "ue %e#3lo"ueia a# threa%# em e#ta%o %e 3lo"ueio por Nait& - %iferena entre o# %oi# a#o# "ue noti80() #$ %e#3lo"ueia uma %a# threa%# "ue e#ta+a em Nait( "ue e# olhi%a ar3itrariamente( en"uanto "ue noti801ll() %e#3lo"ueia to%a#& Depoi# %e %e#3lo"uea%a( a threa% pa##a a ompetir om a# %emai# "ue e#t!o ati+a# pela po##e %o monitor( e #$ %epoi# %e re e35-la "ue +oltar, a exe utar&

23#er+a*e#: a0 2# mto%o# !ait()( noti80()( e noti801ll() #$ po%em #er hama%o# %e %entro %e um 3lo o #in roni'a%o& <e i##o n!o for feito( o ompila%or n!o re lama( ma# em tempo %e exe u!o o orrer, uma ex e!o %o tipo 3llegalMonitor6tate7xception& 30 -# hama%a# %e !ait() %e+em #er feita# #empre %entro %e um lao "ue te#ta a on%i!o para permane er em Nait( e %e+em e#tar %entro %e um 3lo o trH- at h para apturar uma 3nterrupted7xception& E##a ex e!o po%e o orrer #e a threa% em "ue#t!o re e3er uma men#agem interrupt() en"uanto e#ti+er em Nait( aguar%an%o um noti80()& 0 2# mto%o# !ait()' noti80()e noti801ll() #!o %efini%o# na la##e 4bject& 2u #e7a( to%o e "ual"uer o37eto po%e #er #in roni'a%o e ter um monitor a##o ia%o( e re e3er e##a# men#agen#&

Implementa!o %o exemplo: )rimeiro a#o: #em u#ar #in roni'a!o: public class Banco { public static 8inal int L1F4#2T4T1F +9999" )) total de cada conta public static 8inal int (=M2I4(T16 +9" )) nM%ero de contas no banco private long conta@A" )) arra0 -ue ar%aJena os valores de cada conta private int trans8erencias" )) nM%ero de trans8erNncias bancOrias public Banco() { conta ne! long@(=M2I4(T16A" 8or(int i 9" i < (=M2I4(T16" i::) { conta@iA L1F4#2T4T1F" } trans8erencias 9" teste()" } public void trans8ere(int de' int para' int -uantia) { !hile(conta@deA < -uantia) { tr0 { Thread.sleep(P)" }catch(3nterrupted7xception e) {}

} conta@deA Q -uantia"

tr0 { Thread.sleep(+)" )) para au%entar a chance da thread parar no %eio }catch(3nterrupted7xception e) {} conta@paraA : -uantia" trans8erencias::" i8(trans8erencias R P999 } public void teste() { long so%a 9" 8or(int i 9" i < (=M2I4(T16" i::) so%a so%a : conta@iA" 60ste%.out.println(,(o.de transaes* , : trans8erencias : , 6o%a* , : so%a)" } } )) 8i% da classe Banco public class Banco6e%6incronis%o { public static void %ain(6tring@A args) { Banco b ne! Banco()" 8or(int i 9" i < Banco.(=M2I4(T16" i::) { ne! Trans8erencia(b' i).start()" } } } public class Trans8erencia extends Thread { private Banco b" private int de" public Trans8erencia(Banco b' int de) { this.b b" this.de de" } public void run() { int para" !hile(true) { do{ para (int)(Banco.(=M2I4(T16 ; Math.rando%())" } !hile(para de)" int -uantia +:(int)(Banco.L1F4#2T4T1F ; Math.rando%()) )." b.trans8ere(de' para' -uantia)" tr0 { sleep(+)" } catch(3nterrupted7xception e) {} } }

9)

teste()"

<egun%o a#o: U#an%o #in roni'a!o:

class Banco{ public static 8inal int L1F4#2T4T1F +9999" ))Total de cada conta public static 8inal int (=M2I4(T16 +9" ))(M%ero de contas no banco private long conta@A" ))1rra0 -ue ar%aJena o valor das contas private int trans8erencias" ))indica o nM%ero de trans8erNncias bancOrias public Banco() { conta ne! long@(=M2I4(T16A" 8or(int i 9" i < (=M2I4(T16" i::) { conta@iA L1F4#2T4T1F" } trans8erencias 9" teste()" } public s0nchroniJed void trans8ere(int de' int para' int -uantia) { !hile(conta@deA < -uantia) { tr0 { !ait()" }catch(3nterrupted7xception e) {} } conta@deA Q -uantia" tr0 { Thread.sleep(+)" )) para au%entar a chance da thread parar no %eio }catch(3nterrupted7xception e) {} conta@paraA : -uantia" trans8erencias::" i8(trans8erencias R <999 noti80()" } public void teste() { long so%a 9" 8or(int i 9" i < (=M2I4(T16" i::) so%a : conta@iA" 60ste%.out.println(,Transaes* , : trans8erencias : , } } )) 8i% da classe Banco public class BancoIo%6incronis%o { public static void %ain(6tring@A args) { Banco b ne! Banco()" 8or(int i 9" i < Banco.(=M2I4(T16" i::) { ne! Trans8erencia(b' i).start()" } } } public class Trans8erencia extends Thread { private Banco b" private int de" public Trans8erencia(Banco b' int de) { this.b b"

9)

teste()"

6o%a* , : so%a)"

this.de }

de"

public void run() { int para" !hile(true) { do{ para (int)(Banco.(=M2I4(T16 ; Math.rando%())" }!hile(para de)" int -uantia +:(int)(Banco.L1F4#2T4T1F ; Math.rando%()) )." b.trans8ere(de' para' -uantia)" tr0 { sleep(+)" } catch(3nterrupted7xception e) {} } }

Refer5n ia#: Bru e E Jel( C4hinJing in Ja+aD( Or% E%ition( %i#pon9+el em: http://NNN&i3i3lio&org/pu3/%o #/3ooJ#/e Jel/4IJ-Or%-e%itionP&?&'ip <un Ja+a 4utorial Q parte %e%i a%a a 4hrea%# e pro e##o# on orrente#: Con urren H: http://7a+a&#un& om/%o #/3ooJ#/tutorial/e##ential/ on urren H/in%ex&html

Você também pode gostar