Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em...

56
Linguagem de Programação II Carlos Eduardo Ba6sta Centro de Informá6ca - UFPB [email protected]

Transcript of Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em...

Page 1: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

LinguagemdeProgramaçãoII

CarlosEduardoBa6sta

CentrodeInformá[email protected]

Page 2: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Roteiro

•  Introdução•  OmodelodeThreads•  OusodeThreads•  ThreadsPOSIX•  ThreadsJava•  ThreadsSTD(C++11)

Page 3: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Introdução•  Emsistemasoperacionaistradicionais,cadaprocessotemumúnicopontodeexecuçãoemummomentopar6cular.

•  Assimcomoumprocesso,umathreadtemuminício,umasequênciaeumfim.

Umathreadéumfluxoúnicodecontrolesequencialdentrodeumprograma.

Page 4: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Threads•  Podemosenxergarumprocessosobdoisaspectos:

Conjuntoderecursosnecessáriosparaaexecuçãodeumprograma.

Linhaoucontextodeexecução(Thread)

Page 5: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Threads

•  Conjuntoderecursosnecessáriosparaexecuçãodeumprograma:– Espaçodeendereçamento.– Tabeladedescritoresparaarquivosabertos.–  Informaçõessobreprocessosfilhos.– Códigoparatratarsinais(signalhandlers).

Page 6: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Threads

•  Linhaoucontextodeexecução(Thread)– Contadordeprograma– Registradores– Pilhadeexecução

•  Threadssãoen6dadesescalonadasparaaexecuçãosobreaCPU.Tambémchamadosdeprocessosleves.

Page 7: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OmodelodeThreads

(a)Trêsprocessoscadaumcomumathread.(b)Umprocessocomtrêsthreads.

Page 8: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OmodelodeThreads

Page 9: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OmodelodeThreads

�  Naprimeiracolunaconstamositenscompar6lhadosportodasasthreadsemumprocesso.

�  Asegundaécompostapelositenspriva6vosdecadathread.

Page 10: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Omodelodethreads

•  Cadathreadtemasuapilhaprópria,mascompar6lhaomesmoespaçodeendereçamentodoprocessoemquefoicriada

•  Seduasthreadsexecutamomesmoprocedimento/método,cadaumateráasuaprópriacópiadasvariáveislocais

•  Asthreadspodemacessartodasosdadosglobaisdoprograma,eoheap(memóriaalocadadinamicamente)

•  Nesseacessoadadosglobais(i.e.quandooacessoincluimaisdoqueumainstruçãodemáquina),asthreadsprecisamteracessoemregimedeexclusãomútua(p.ex.usandolocks)

Page 11: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OmodelodeThreads•  Umathread,assimcomoosprocessos,podeestaremumdosseguintesestados:emexecução,bloqueado,pronto(etambémfinalizado).

•  Éimportantefrisarquecadathreadtemsuaprópriapilha,compar6lhando,assim,apenasasvariáveisglobais.

Page 12: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OmodelodeThreads

Pilhasdasthreads

Page 13: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OusodeThreads

Quaisasdiferençasdasthreadsemrelaçãoaosprocessos?

Page 14: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OusodeThreads•  Threads

– Algumasaplicaçõesnecessitamdeumaparalelizaçãoqueofereçacompar6lhamentoderecursos.

– Threadssãocriadasedestruídasmaisrapidamentequeprocessos,vistoquenãopossuemrecursosassociados.

– Aimplementaçãodacooperaçãoentrethreadsémaissimpleseseudesempenhoémelhor.

Page 15: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OusodeThreads•  Threads

Umprocessadordetextocomtrêsthreads.

Page 16: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OusodeThreads•  Threads

Umservidorwebcommúl6plasthreads.

Page 17: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OusodeThreads•  Threads

�  Códigosimplificadoparaoslideanterior◦  (a)Threaddespachante◦  (b)Threadoperária

Page 18: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

OusodeThreads

Page 19: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsPOSIX

•  NormainternacionalIEEEPOSIX11003.1C– ApenasaAPIénormalizada– éfáciltrocarabibliotecaqueimplementaanormaemtempodecompilação,masnãoemtempodeexecução

•  ThreadsPOSIXpodemimplementarthreadsemníveldeusuário,emníveldekerneloumisto

Page 20: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Pthreads

•  POSIX1003.1-2001–pthreads•  APIparagerenciamentodethreads

–  >more/usr/include/pthread.h–  >manpthread_create

•  Threadsco-existemnummesmoprocesso,compar6lhandováriosrecursos,massãoescalonadasseparadamentepelosistemaoperacional

•  Somenteomínimonecessárioderecursoséreplicadoentreduasthreads

20

Page 21: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Visãogeral

SemThreads ComThreads

Page 22: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsPOSIX#include <pthread.h> #include <stdlib.h> #define NUM_THREADS 5 void ∗PrintHello(void ∗threadid) { long tid = (long)threadid; printf("Olá! Sou a thread #%ld!\n", tid); pthread_exit(NULL); } int main (int argc, char ∗argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; for(t=0; t<NUM_THREADS; t++){ printf("main: criando thread %ld\n", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void ∗)t); if (rc){ printf("ERRO; pthread_create() devolveu o erro %d\n", rc); exit(−1); } } for(t=0; t<NUM_THREADS; t++){ pthread_join(threads[t], NULL); } }

Page 23: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

PThreadAPI

Prefix Funcionality

pthread_ Threads themselves and miscellaneous subroutines

pthread_attr_ Thread attributes objects

pthread_mutex_ Mutexes

pthread_mutexattr_ Mutex attributes objects

pthread_cond_ Condition variables

pthread_cond_attr Condition attributes objects

pthread_key_ Thread-specific data keys

Page 24: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Comoprogramar

•  Usar– #include “pthread.h”

•  Compilarcomaopção–pthread– gcc –pthread ex_pthread.c –o ex_pthread

Page 25: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Criandoumathreadint pthread_create(pthread_t * thread,

const pthread_attr_t * attr, void * (*start_routine)(void *),

void *arg);

Page 26: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Encerrandoumathread

•  Alémdaalterna6vadesimplesmenteencerrarafunção,épossíveltambém– void pthread_exit(void *retval);

Page 27: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

PthreadJoin

•  Aro6napthread_join()esperapelotérminodeumathreadespecífica

for(i=0;i<n;i++)pthread_create(&thread[i],NULL,(void*)slave,(void*)&arg);...threadmestrefor(i=0;i<n;i++)pthread_join(thread[i],NULL);

Page 28: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

DetachedThreads(desunidas)Podeserqueumathreadnãoprecisesaberdotérminodeumaoutraporelacriada,entãonãoexecutaráaoperaçãodeunião.Nestecasodiz-sequeothreadcriadoédetached(desunidodathreadpaiprogenitor)

Programaprincipal

pthread_create();

pthread_create();

Thread

pthread_create();Thread

Thread Término

TérminoTérminopthread_exit

Page 29: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Pthreads

•  Quandodoisoumaisthreadspodemsimultaneamentealteraràsmesmasvariaveisglobaispoderásernecessáriosincronizaroacessoaestevariavelparaevitarproblemas.

•  Códigonestascondiçãodiz-se“umaseçãocri6ca”–  Porexemplo,quandodoisoumaisthreadspodemsimultaneamenteincrementarumavariávelx

–  /*codigo–SeçãoCri6ca*/–  x=x+1;

•  Umaseçãocrí6capodeserprotegidau6lizando-septhread_mutex_lock()epthread_mutex_unlock()

29

Page 30: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Lock/Mutex/* Note scope of variable and mutex are the same */ pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; int counter=0; /* Function C */ void functionC() { pthread_mutex_lock( &mutex1 ); counter++ pthread_mutex_unlock( &mutex1 ); }

Page 31: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Fontesdeproblemas

•  Condiçãodecorrida–  Nãoassumaumaordemespecíficaparaaexecuçãodasthreads–  Umcódigopodefuncionarmuitobememdeterminadosmomentosegerarsériosproblemasemoutros

•  Threadsafecode–  Usebibliotecasquepossuamchamadas“threadsafe”–  Váriaschamadasàmesmafunçãodevemserpermi6das

•  Deadlock

Page 32: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

Leituracomplementar

•  hwp://pages.cs.wisc.edu/~travitch/pthreads_primer.html•  hwps://compu6ng.llnl.gov/tutorials/pthreads/exercise.html•  hwp://students.cs.byu.edu/~cs460ta/cs460/labs/pthreads.html

Page 33: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)

•  BibliotecapadrãoSTDpassouaincluirsuporteathreads•  Criaçãoegerênciadociclodevidadethreads•  #include<thread>•  CompiladordevesuportarC++11

– Opções-std=c++0x"ou"-std=c++11"noGCCparaa6varsuporte

Page 34: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)#include <iostream> // std::cout #include <thread> // std::thread void foo() { std::cout << “foo!” << endl; } void bar(int x) {std::cout << “bar: ” << x << endl; } int main() { std::thread first (foo); // spawn new thread that calls foo() std::thread second (bar,10); // spawn new thread that calls bar(10) std::cout << "main, foo and bar now execute concurrently...\n"; // synchronize threads: first.join(); // pauses until first finishes second.join(); // pauses until second finishes std::cout << "foo and bar completed.\n"; return 0; }

Page 35: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)class thread { public: class id; typedef /*implementation-defined*/ native_handle_type; thread() noexcept; template <class F, class ...Args> explicit thread(F&& f, Args&&... args); ~thread(); thread(const thread&) = delete; thread(thread&&) noexcept; thread& operator=(const thread&) = delete; thread& operator=(thread&&) noexcept; void swap(thread&) noexcept; bool joinable() const noexcept; void join(); void detach(); id get_id() const noexcept; native_handle_type native_handle(); static unsigned hardware_concurrency() noexcept; };

Page 36: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)

this_thread providefunc6onsthataccesscurrentthethreadofexecu6on

yield(C++11)

suggeststhattheimplementa6onrescheduleexecu6onofthreads(func6on)

get_id(C++11)

returnsthethreadidofthecurrentthread(func6on)

sleep_for(C++11)

stopstheexecu6onofthecurrentthreadforaspecified6medura6on(func6on)

sleep_un6l(C++11)

stopstheexecu6onofthecurrentthreadun6laspecified6mepoint(func6on)

Page 37: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)#include <thread> #include <iostream> #include <vector> void hello(){ std::cout << "Hello from thread “; std::cout << std::this_thread::get_id() << std::endl; } int main(){ std::vector<std::thread> threads; for(int i = 0; i < 5; ++i){ threads.push_back(std::thread(hello)); } for(auto& thread : threads){ thread.join(); } return 0; }

Page 38: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)#include <thread> #include <iostream> class TestClass { int i; public: TestClass(int n) { i = n; } void greeting(std::string const& message) const { std::cout << message << std::endl; std::cout << "My number: " << n << std::endl; } }; int main() { TestClass x(10); std::thread t(& TestClass::greeting,&x,"Hello! "); t.join(); }

Page 39: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)

#include ... int main() { std::shared_ptr<SayHello> p(new SayHello); std::thread t(&SayHello::greeting,p,"goodbye"); t.join(); } // What if you want to pass in a reference to an // existing object, and a pointer just won't do? // That is the task of std::ref.

Page 40: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)

#include <thread> #include <iostream> void write_sum(int x,int y) { std::cout<<x<<" + "<<y<<" = "<<(x+y)<<std::endl; } int main() { std::thread t(write_sum,123,456); t.join(); }

Page 41: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)#include <thread> #include <iostream> #include <functional> // for std::ref class PrintThis { public: void operator()() const { std::cout<<"this="<<this<<std::endl; } }; int main() { PrintThis x; x(); std::thread t(std::ref(x)); t.join(); std::thread t2(x); t2.join(); }

/*this=0x7ff�08bf7efthis=0x7ff�08bf7efthis=0x42674098*/

Page 42: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)

#include <thread> #include <iostream> #include <functional> void increment(int& i) { ++i; } int main() { int x=42; std::thread t(increment,std::ref(x)); t.join(); std::cout<<"x="<<x<<std::endl; }

Page 43: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)

•  std::mutex•  std::lock_guard<>•  std::unique_lock<>•  Evitandodeadlockscommúl6plosmutexes...

Page 44: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsSTD(C++11)

•  Leituracomplementar•  hwp://cppwisdom.quora.com/Why-threads-and-fork-dont-mix•  hwp://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them

Page 45: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsJava

•  Javaincorporouaoseunúcleoasprimi6vasdesimultaneidade.•  Outraslinguagens,comoCeC++,necessitamdebibliotecasespecíficasparapermi6rqueseusprogramassejamexecutadoscommúl6plasthreads.

•  ThreadspodemsercriadasatravésdaclasseThreadedainterfaceRunnable.

Page 46: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava

•  ClasseThread– Fazpartedopacotejava.lang.– UmaclassequeherdadeThreadtemapossibilidadedeserexecutadadeformaparalela.

– Énecessáriosobrescreverométodorun().– ParainiciaraexecuçãodeumobjetoThread,seumétodostart()deveserinvocado.

Page 47: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava

•  InterfaceRunnable– Presentenopacotejava.lang.– Possuiapenasummétodoparaserimplementado:ométodorun().– UmobjetoThreaddevesercriado,passandocomoparâmetroparaseuconstrutorumobjetoRunnable.

– Ainvocaçãodométodostart()doobjetoThreadexecutaráasinstruçõesdométodorun()doobjetoRunnable.

Page 48: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava

•  ThreadversusRunnable– AclasseThreadimplementaainterfaceRunnable.– AclasseThreadémaisfácildeseru6lizadaeéamaisindicadaparaaplicaçõessimples.

– AimplementaçãodainterfaceRunnableérequeridaquandoprecisamosdarsuporteamul5threadingemumaclassequejáéderivadadeoutradiferentedeThread.

–  JavanãosuportaherançamúlKpla.

Page 49: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava•  Escalonamento

– AJVMpossuiumescalonadordethreadsresponsávelpordecidirquethreadvaiexecutaremdeterminadomomento.

– AlinguagemJavanãoestabeleceumaformapadronizadaparaoescalonamentodethreads,nãogaran6ndo,portanto,quehajajus6çaemsuaexecução.

– DoismodelosdeescalonamentonorteiamaimplementaçãodaJVM:green-threadmodeleona.ve-threadmodel.

Page 50: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava

– Green-ThreadModel•  AsthreadssãoescalonadaspelaprópriaJVM.•  AJVMéaresponsávelporsalvarocontextodasthreads.•  OsistemaoperacionaldesconheceaexistênciadasthreadscontroladaspelaJVM.

– Na.ve-ThreadModel•  AsthreadssãoescalonadaspelosistemaoperacionalsobreoqualaJVMestásendoexecutada.

•  OSOnãofazdis6nçãoseusprocessoseasthreadsdaJVM.

Page 51: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava•  Prioridades

– Dizrespeitoàprioridadedeexecuçãodecadathread.– TodathreadpossuiumaprioridadenointervalodeThread.MIN_PRIORITYaThread.MAX_PRIORITY(intervalode1a10).

– Quandoumathreadécriada,elarecebe,porpadrão,umaprioridadeigualacinco(Thread.NORM_PRIORITY).

– ManipuladaatravésdosmétodosgetPriorityesetPriority.

Page 52: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava•  Prioridades

– Aformacomoasprioridadessãou6lizadasdependedoSO,daJVMedomodelodeescalonamentou6lizados.

– NasimplementaçõesdaJVMqueseguemgreen-threadmodel,emgeralnãohápreempçãoportempo.

•  ThreadsperdemaCPUquandoconcorremcomoutrasdemaiorprioridadeouentãoquandosãobloqueadas.

– AplataformaWindowssegueoescalonamentoround-robin.

Page 53: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava•  Métodosleep()

– Fazathreademexecuçãodormirporumperíododetempoespecificado.

– AthreadpassaparaoestadoEsperando.– Aprecisãodependedostemporizadoresdosistemaedoescalonador.

– LançaumaInterruptedExcepKon.

static void sleep(long millis)

static void sleep(long millis, int nanos)

Page 54: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava•  Métodoyield()

– FazathreademexecuçãovoltarparaoestadoPronta.•  Permitequeoutrasthreadsdemesmaprioridadesejamexecutadas.

– Nãohácomogaran6rqueasoutrasthreadsserãoescolhidaspeloescalonador.

•  Ométodoyield()podenãofuncionar!

static void yield()

Page 55: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava•  Métodojoin()

– Permitequeumathreadaguardeotérminodeoutra.– Exemplo:

•  Athreademexecuçãoserápausadaatéqueathreadt1termine.

– LançaumaInterruptedExcepKon.

void join()

void join(long millis)

void join(long millis, int nanos)

t1.join()

Page 56: Linguagem de Programação IIwiki.cbatista.net/lib/exe/fetch.php/lpii-162_threads.pdf · Threads em Java • Escalonamento – A JVM possui um escalonador de threads responsável

ThreadsemJava

•  ComparKlhamentodeMemória– Atravésdemembrosdeclasse(sta5c).– U6lizaçãodeobjetoscompar6lhados.