A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Estudo Certificação Java Capítulo 6 - Threads. Estudo Certificação Java Roteiro O que uma thread executa Estados e prioridades de um thread Controlando.

Apresentações semelhantes


Apresentação em tema: "Estudo Certificação Java Capítulo 6 - Threads. Estudo Certificação Java Roteiro O que uma thread executa Estados e prioridades de um thread Controlando."— Transcrição da apresentação:

1 Estudo Certificação Java Capítulo 6 - Threads

2 Estudo Certificação Java Roteiro O que uma thread executa Estados e prioridades de um thread Controlando (yelding, suspending, sleeping, blocking) Monitor States e Implementações de escalonamento (wait, notify) Lock e sincronização Além do modelo puro e maneiras estranhas de sincronizar

3 Estudo Certificação Java O que uma thread executa (1) Conteúdo do run() Não imediatamente! A invocação do start() registra aquele código a um escalonador de threads e o torna elegível para rodar 2 maneiras: extends Thread e implements Runnable

4 Estudo Certificação Java O que uma thread executa (2) public class CounterThread extends Thread{ public void run() { for (int i=0; i<10;i++) { System.out.println(Counting: +i); } CounterThread ct = new CounterThread(); ct.start();

5 Estudo Certificação Java O que uma thread executa (3) public class DownCounter implements Runnable{ public void run() { for (int i=10; i>=1;i--) { System.out.println(Counting down: +i); } DownCounter dc = new DownCounter(); Thread t = new Thread(dc); t.start();

6 Estudo Certificação Java O que uma thread executa (4) zimplements vs. extends yextends tem o problema de não haver herança múltipla em Java yextends é mais simples yimplements está mais de acordo com a idéia de OO: o fato de uma classe se comportar como uma thread não necessariamente justifica a força de dizer que é uma Thread zvoltando do run a Thread está morta: não pode restartar, mas pode invocar seus métodos zstop() não existe no 1.2: usar interrupt()

7 Estudo Certificação Java Estados de uma Thread Monitor States Running Ready Suspended AsleepBlocked z suspend deprecated z apenas o escalonador pode mexer numa ready thread

8 Estudo Certificação Java Prioridades de uma Thread Inteiros de 1 a 10. Geralmente escolhe-se entre as waiting threads de maior prioridade Não há garantia de que a que espera há mais tempo será escolhida Default é 5, mas as novas são criadas com a prioridade da Thread que as criou int oldPriority = theThread.getPriority(); int newPriority = Math.min(oldPriority+1,Thread.MAX_PRIORITY); theThread.setPriority(newPriority);

9 Estudo Certificação Java Controlando Threads (1) zYeld: de Running p/ Ready ypermite que outras Threads que estejam waiting seja escalonadas yse não houver outras esperando, então continua rodando imediatamente yexemplo: rotina pesada faz um yeld periodicamente p/ dar tempo da GUI atuar (botão interromper poder ser pressionado) yvale a pena diminuir prioridade também, mas não é garantia de funcionar em todas plataformas

10 Estudo Certificação Java Controlando Threads (2) zSuspending: não caem na prova zSleeping: mantém dormindo por um período (milisegundos e nanosegundos opcionalmente) ytempo expirado ou interrupt -> Ready ycomo yeld é método estático yhavendo interrupt() sobre ela, joga InterruptedException ao voltar p/ Running state

11 Estudo Certificação Java Controlando Threads (3) zBlocking: de Running p/ Blocked yusada para esperar que alguma condição ocorra: exemplo I/O try { Socket sock = new Socket(magnesium, 5505); InputStream istr = sock.getInputStream(); int b = istr.read(); } catch (IOException ex) {} ysai desse estado quando a condição é satisfeita, ou quando ocorre interrupt

12 Estudo Certificação Java zMonitor states são bem diferentes dos demais zwait() coloca em espera e notify() (e notifyAll()) de volta a Ready: ysão implementados em Object ysó podem ser chamados em código synchronized zPodem ser preemptivo ou time-sliced: depende da plataforma Monitores wait() e notify() (1)

13 Estudo Certificação Java class Mailbox { public boolean request; public String message; } public class Consumer extends Thread { private Mailbox myMailbox; public Consumer (Mailbox box) { this.myMailbox = box;} public void run() { while (true) { if (myMailbox.request) { System.out.println(myMailbox.message); myMailbox.request = false; } try {sleep(50);} catch (InterruptedException e) {} } Monitores wait() e notify() (2)

14 Estudo Certificação Java zNada impede que entre o checar o request e imprimir, outra thread mude a mensagem zA escolha do tempo de verificação do request é difícil zOs recursos compartilháveis tem que estar protegidos (synchronized) zQuem verifica request deve esperar um tempo razoável e ser notificado de sua mudança Monitores wait() e notify() (3)

15 Estudo Certificação Java zMarca-se código com synchronized e a VM faz: yum thread que quiser executar tal código tem que obter o lock yse lock não estiver disponível, fica no estado de esperando lock yquando lock é obtido a thread vai para Ready zmarca-se método como synchronized ou parte de um código Lock e Sincronização (1)

16 Estudo Certificação Java zMas ainda tem-se o problema dos clientes de como eles vão saber e esperar pelo lock para chamar store e retrieve Lock e Sincronização (2) class Mailbox { private boolean request; private String message; public synchronized void storeMessage(String message) { request = true; this.message = message;} public synchronized String retrieveMessage() { request = false; return message; }

17 Estudo Certificação Java Lock e Sincronização (3) Running Ready Waiting Seeking lock Notify, notifyAll, timeout ou interrupt Entra em código synchronized wait Lock obtido escalonado

18 Estudo Certificação Java Lock e Sincronização (4) public synchronized String retrieveMessage() { while (request == false) { try { wait(); } catch (InterruptedException e) {} } request = false; return message; } public synchronized void storeMessage(String message) { this.message = message; request = true; notify(); }

19 Estudo Certificação Java zSe um consumidor quiser chamar retrieve num objeto sem mensagem ele entra no waiting state zEm algum momento um produtor coloca uma mensagem e por conseguinte muda o request e notifica zO consumidor vai para seeking lock e quando o obtém imprime uma mensagem consistente Lock e Sincronização (5)

20 Estudo Certificação Java Lock e Sincronização (6) public synchronized String retrieveMessage() { while (request == false) { try { wait(); } catch (InterruptedException e) {} }request = false; notify(); return message; } public synchronized void storeMessage(String message) { while (request == true) { try {wait(); } catch (InterruptedException e) {} } request = true; this.message = message; notify(); } z Resolve problema de produtor usar store quando já há message

21 Estudo Certificação Java zWait. A thread que a chamou: ydesiste da CPU ydesiste do lock yvai p/ o pool de monitores em waiting znotify: ysái do pool de monitores em waiting e vai p/ o estado de seeking lock yterá de re-adquirir o lock p/ prosseguir Resumindo wait e notify

22 Estudo Certificação Java zUsar while ao invés de if p/ continuar esperando no caso do estado não estar ok zusar notifyAll ao invés de notify p/ notificar todas as threads Além do modelo puro (+ de 1 produtor/consumidor) public synchronized void mixedUpMethod { while (i 4.3f || message.equals(UH-HO) { try { wait(); } catch (InterruptedException e) {} } // modifica o estado do monitor e… notifyAll(); }

23 Estudo Certificação Java zFazer lock de uma porção do código em relação a um determinado objeto zprovável objetivo: liberar locks o quanto antes não bloqueando o método inteiro zlock também pode ser sobre this Maneiras estranhas de sincronizar class Strange Sync { Rectangle rect = new Rectangle(11, 13, 1100, 1300); void doIt() { int x = 504; int y = x/3; synchronized(rect) { rect.width -= x;rect.heigth -=y; }


Carregar ppt "Estudo Certificação Java Capítulo 6 - Threads. Estudo Certificação Java Roteiro O que uma thread executa Estados e prioridades de um thread Controlando."

Apresentações semelhantes


Anúncios Google