Escolar Documentos
Profissional Documentos
Cultura Documentos
Threads - concorrncia
Java Threads 1
Informtica UFRGS
Autoria
Autor
inicial:traduo da verso inglesa por aluno do CIC revises, adies: C. Geyer e diversos alunos
Local
Instituto de Informtica UFRGS disciplina : Programao Distribuda e Paralela verso atual: V25, maro de 2009
Java Threads 2
Informtica UFRGS
Fontes
Java Threads 3
Informtica UFRGS
Smula
Smula
expresso da concorrncia em Java conceitos de threads e Java threads criao de threads: por herana e por interface exemplo sincronizao em Java conceitos de monitores excluso mtua em Java threads sinalizao em Java threads exemplo outros recursos de Java threads
Programao com Objetos Distribudos (C. Geyer) Java Threads 4
Informtica UFRGS
Bibliografia
Bibliografia
Lea, D. Concurrent Programming in Java - Design Principles and Patterns. Addison-Wesley, 1997. Oaks, S. and Wong, H. Java Threads. OReilly, 1997. Farley, Jim. Java - Distributed Computing. Ed. O'Reilly, 1998.
Java Threads 5
Informtica UFRGS
Bibliografia
Bibliografia (cont.)
Arnold, K. and Gosling, J. The Java Language. AddisonWesley, 1996. Orfali, R. and Harkey, D. Client/Server Programming with JAVA and CORBA. John Wiley, 1997. Wutka, M. Java - Expert Solutions. Que, 1997. Walnum, Clayton. Java by Examples. Que, 1996. Campione, Mary e Walrath, K. The Java Tutorial. Addison-Wesley, 2a. ed., 1998. Cornell, Gary e Horstmann, Cay. Core Java. Sunsoft Press., 1996. Flanagan, David. Java in a Nutshell. O'Reilly Assoc., 2a. ed., 1997.
Programao com Objetos Distribudos (C. Geyer) Java Threads 6
Informtica UFRGS
Bibliografia
Bibliografia (cont.)
Grand, Mark. Java Language Reference. O'Reilly Assoc., 2a. ed., 1997. Niemeyer, P. e Peck, Josh. Exploring Java. O'Reilly Assoc., 2a. ed., 1997.
Java Threads 7
Informtica UFRGS
Endereos
Endereos
site da Sun sobre tecnologia Java http://java.sun.com notas tcnicas http://java.sun.com/jdc/tecDocs/newsletter/index.html tutorial Java http://javasoft.com/docs/books/tutorial/index.html Documentao Java: http://java.sun.com/docs/white/index.html
Java Threads 8
Informtica UFRGS
Endereos
Endereos (cont.)
tutor Java http://www.mercury.com/java-tutor/ Java ensina Java http://www.neca.com/~vmis/java.html outro tutorial Java http://www.phrantic.com/scoop/onjava.html
Java Threads 9
Informtica UFRGS
Concorrncia
Informtica UFRGS
Concorrncia
Informtica UFRGS
Concorrncia
Informtica UFRGS
Tipos de Threads
Tipos de threads
Deamons e normais (no deamons) Deamons Devem ser marcadas como deamons Ou so filhas (foram criadas por) de deamons Incio do programa (ou da JVM) Usualmente somente 1 thread normal
Java Threads 13
Informtica UFRGS
Final de Programa
Java Threads 14
Informtica UFRGS
Concorrncia
Escalonamento
conceito: funo para determinar quando e por quanto tempo um thread executada (a cpu alocada thread) implementado por nas 1as verses pela mquina virtual de Java (JVM) atualmente por 2 opes como nas 1as verses de forma hbrida pela JVM e por um pacote de threads (SO, ) conforme esquema de escalonamento preemptivo, baseado em prioridades
Java Threads 15
Informtica UFRGS
Concorrncia
Aplicaes de threads
entrada e sada assncrona tratamento assncrono de requisies em sistemas cliente/servidor processos de servio em retaguarda (background); por exemplo, coletores de lixo (garbage collectors) sistemas reativos que precisam tratar certos eventos rapidamente usando escalonamento baseado em prioridades servidores de tempo processamento paralelo: uso do poder de computao das mquinas multiprocessadoras jogos, simuladores
Programao com Objetos Distribudos (C. Geyer) Java Threads 16
Informtica UFRGS
Prioridades e nomes
Java Threads 17
Informtica UFRGS
Prioridades e nomes
Java Threads 18
Informtica UFRGS
Identificador de threads
Identificador de threads
Toda thread possui um identificador, atribudo pela JVM Um identificador um inteiro nico, inaltervel Quando uma thread for terminada, seu identificador poder ser reusado O identificador de uma thread pode ser recuperado com o mtodo: public long getId()
Java Threads 19
Informtica UFRGS
Java Threads 20
Informtica UFRGS
Concorrncia
Criao de threads
mtodo A: estender a classe Thread definindo uma nova subclasse reescrever o mtodo run() criar um objeto da nova subclasse
Java Threads 21
Informtica UFRGS
Concorrncia
Criao de threads
mtodo B: definir uma classe C que implementa a interface Runnable criar um objeto O da classe C criar um objeto do tipo Thread (classe) passando o objeto O como parmetro importante: objeto da classe C no Thread
Java Threads 22
Informtica UFRGS
Concorrncia
Criao de threads
em ambos os mtodos objeto thread foi somente criado ativao da execuo (fluxo) da thread pelo mtodo start() start() semntica assncrona similar do fork do Unix start Main ou thread atual Nova thread
Java Threads 23
Informtica UFRGS
Concorrncia
Java Threads 24
Informtica UFRGS
Concorrncia
Java Threads 25
Informtica UFRGS
Concorrncia
Java Threads 26
Informtica UFRGS
Concorrncia
Java Threads 27
Informtica UFRGS
Concorrncia
t1.start(); t2.start(); t3.start(); } } execuo provvel: Hello, this is Second! Hello, this is First! Hello, this is Third!
Java Threads 28
Informtica UFRGS
Concorrncia
Java Threads 29
Informtica UFRGS
Concorrncia
Java Threads 30
Informtica UFRGS
Concorrncia
Java Threads 31
Informtica UFRGS
Concorrncia
Mtodo join()
semntica similar da primitiva join do conceito fork/join tarefa (thread) chamadora fica bloqueada esperando final da thread chamada similar a waitpid no Unix 3 formas join(): simples join(long milisegundos) espera at milisegundos se zero: espera infinita; silimar a join simples join(long milisegundos, long nanosegundos) espera milisegundos mais nanosegundos
Programao com Objetos Distribudos (C. Geyer) Java Threads 32
Informtica UFRGS
Concorrncia
Mtodo join
exemplo thread main t1 = new MyThread(); t1.start(); t1.join();
Java Threads 33
Informtica UFRGS
Quantidades de threads
Quantidades de threads
por JVM testes feitos por Maurcio Pilla em 2000-1 criao de threads at a falha da JVM cada thread executou um comando sleep(99999999999999)
Java Threads 34
Informtica UFRGS
Quantidades de threads
Quantidades de threads
resultados Maquina TINI (chip com JVM): 64 threads informao da documentao Maquina Sun UltraSparc 10 com 128 MB e 100 MB de heap na JVM: 954412 threads SO: Solaris Maquina Sun UltraSparc 10 com 512 MB e 400 MB de heap na JVM: 3939782 threads SO: Solaris
Programao com Objetos Distribudos (C. Geyer) Java Threads 35
Informtica UFRGS
Quantidades de threads
Quantidades de threads
consideraes de acordo com os experimentos, e no havendo limitao explcita na especificao de Java nem na documentao do JDK, possvel que o nmero mximo de threads dependa principalmente da memria disponvel e, eventualmente, de limites impostos pela implementao da JVM (principalmente em sistemas tempo real e embarcados).
Java Threads 36
Informtica UFRGS
Java Threads 37
Informtica UFRGS
Exerccios de concorrncia
Exerccio A
passar o exemplo de 3 threads que dormem para a forma de criao por interface (B) cuidar uso de mtodos com objetos do tipo correto mtodo sleep (tambm) um mtodo de instncia da classe Thread
Exerccio B
incluir em ponto(s) adequado(s) a espera da thread main pelo fim das threads filhas
Java Threads 38
Informtica UFRGS
Sincronizao
Sincronizao
conceito geral de monitores um monitor consiste de: estruturas de dados coleo de procedures que operam sobre as estruturas do monitor conceito de dados protegidos as estruturas s podem ser acessadas pelas procedures do monitor
Java Threads 39
Informtica UFRGS
Sincronizao
Sincronizao
conceito geral de monitores excluso mtua: somente uma thread cliente pode executar uma procedure do monitor em um momento gera fila de entrada no monitor threads bloqueadas esperando sua vez
Java Threads 40
Informtica UFRGS
Sincronizao
Sincronizao
conceito geral de monitores varaveis de condio variveis especiais sobre as quais podem ser chamadas as operaes wait e signal dentro do monitor
Java Threads 41
Informtica UFRGS
Sincronizao
Sincronizao
conceito geral de monitores operao wait: coloca a prpria thread em estado bloqueado (dormindo) numa lista de espera do monitor isto permite a execuo de outra thread lista de espera: associada varivel de condio vc1.wait()
Java Threads 42
Informtica UFRGS
Sincronizao
Sincronizao
conceito geral de monitores operao signal: acorda uma outra thread que est na lista de espera associada varivel de condio vc1.signal() questo: qual thread continua sua execuo imediatamente? a que acorda?: mais eficiente a acordada?: mais seguro
Java Threads 43
Informtica UFRGS
Sincronizao
Sincronizao
conceito geral de sincronizao de threads (Java): monitores em Java: monitor um objeto qualquer, compartilhado por vrias threads (servidor), pode ser visto como um monitor diversas diferenas com relao ao conceito clssico de monitor
Java Threads 44
Informtica UFRGS
Sincronizao
Informtica UFRGS
Sincronizao
Java Threads 46
Informtica UFRGS
Sincronizao
Java Threads 47
Informtica UFRGS
Sincronizao
Informtica UFRGS
Sincronizao
Informtica UFRGS
Sincronizao
Java Threads 50
Informtica UFRGS
Sincronizao
Informtica UFRGS
Sincronizao
Java Threads 52
Informtica UFRGS
Sincronizao
Java Threads 53
Informtica UFRGS
Sincronizao
Java Threads 54
Informtica UFRGS
Sincronizao
Java Threads 55
Informtica UFRGS
Sincronizao
Informtica UFRGS
Java Threads 57
Informtica UFRGS
Exemplo Buffer
Java Threads 58
Informtica UFRGS
Exemplo Buffer
Java Threads 59
Informtica UFRGS
Exemplo Buffer
Java Threads 60
Informtica UFRGS
Exemplo Buffer
Java Threads 61
Informtica UFRGS
Exemplo Buffer
Java Threads 62
Informtica UFRGS
Exemplo Buffer
Java Threads 63
Informtica UFRGS
Exemplo Buffer
Exemplo Buffer
soluo com buffer em array fonte: Lea, D. Concurrent Programming in Java. Addison-Wesley, 1997. class BoundedBufferWithStateTracking { protected final Object[] array; // the elements protected int putPtr = 0; // circular indices protected int takePtr = 0; protected int usedSlots = 0; // the count
Java Threads 64
Informtica UFRGS
Exemplo Buffer
Exemplo Buffer
public BoundedBufferWithStateTracking(int capacity) throws IllegalArgumentException { if (capacity <= 0) throw new IllegalArgumentException(); array = new Object[capacity]; } public synchronized int size() { return usedSlots; } public int capacity() { return array.length; }
Java Threads 65
Informtica UFRGS
Exemplo Buffer
Exemplo Buffer
public synchronized void put(Object x) throws InterruptedException { while (usedSlots == array.length) // wait until not full wait(); array[putPtr] = x putPtr = (putPtr + 1) % array.length; // cyclically inc if (usedSlots++ == 0) notifyAll(); } // signal if was empty
Java Threads 66
Informtica UFRGS
Exemplo Buffer
Exemplo Buffer
public synchronized Object take() throws InterruptedException{ while (usedSlots == 0) wait(); // wait until not empty
Object x = array[takePtr]; array[takePtr] = null; takePtr = (takePtr + 1) % array.length; if (usedSlots-- == array.length) // signal if was full notifyAll(); return x; } }
Programao com Objetos Distribudos (C. Geyer) Java Threads 67
Informtica UFRGS
Exerccios
Exerccio A
explique eventuais diferenas de semntica (execuo) caso a condio de wait seja feita por um if
Exerccio B
explique (justifique ou no) se o programa funciona corretamente para dois ou mais produtores ou consumidores
Exerccio C
faa um pseudo cdigo de um programa com 1 produtor, 1 consumidor e um buffer
Java Threads 68
Informtica UFRGS
Controle de threads
Java Threads 69
Informtica UFRGS
Controle de threads
Java Threads 70
Informtica UFRGS
Controle de threads
Java Threads 71
Informtica UFRGS
Controle de threads
Java Threads 72
Informtica UFRGS
Controle de threads
Java Threads 73
Informtica UFRGS
Controle de threads
Java Threads 74
Informtica UFRGS
Outros Tpicos
Outros tpicos
mtodo currentThread no usar dados public ou protected herana x sync (Arnold pg173) uso dado sincronizado como lock (Arnold pg174) tornar classe sincronizada (Arnold pg175)
Java Threads 75
Informtica UFRGS
Outros Tpicos
Outros tpicos
wait x while x if (Arnold pg175) wait, notify x sync (Arnold pg176) notify x notifyAll (Arnold pg177) join (Arnold pg184)
Java Threads 76
Informtica UFRGS
Outros Tpicos
Outros tpicos
volatile (Arnold pg188) conceitos de grupos (Arnold pg188 e Evandro) prioridades (Arnold pg188 e alunos) trmino de thread em loop (Arnold pg183) trmino de aplicao x setDeamon (Arnold pg185) depurao (Arnold pg192)
Java Threads 77
Informtica UFRGS
Timer Tasks
Timer Tasks
classe Timer objetos definem tempos classe TimerTask objeto define uma tarefa com restries de tempo algumas variaes de restries aps certo tempo peridico em determinado dia e hora
Java Threads 78
Informtica UFRGS
Timer Tasks
Timer Tasks
mtodos de fim de uma tarefa por mtodo cancel() tornando a tarefa em um deamon remoo de todas as referncias tarefa aps o final da mesma (mtodo usual) pelo mtodo System.exit() encerra o programa
Java Threads 79
Informtica UFRGS
Timer Tasks
Timer Tasks
fim de programa X tarefas (threads) outras threads podem impedir fim de programa exemplo: funo beep do toolkit AWT para terminar o programa, pode ser necessrio uso do System.exit()
Java Threads 80
Informtica UFRGS
Java Threads 81
Informtica UFRGS
Java Threads 82
Informtica UFRGS
Autoria
Autores
Cristiano Andr da Costa Alan Carvalho Assis
Local
disciplinas: PDP e POD II-UFRGS
Java Threads 83
Informtica UFRGS
Pacote java.util.concurrent.*
Programao com Objetos Distribudos (C. Geyer) Java Threads 84
Informtica UFRGS
Variveis Atmicas
manipulao atmica de variveis (tipos primitivos ou objetos) fornecendo aritmtica atmica de alto desempenho e mtodos compare-and-set pacote java.util.concurrent.atomic
Sincronizadores
mecanismos de propsito geral para sincronizao: semforos classe Semaphores (incluindo excluso mtua); barreiras classe CyclicBarrier travas classe CountDownLatch trocadores classe Exchanger<V>.
Programao com Objetos Distribudos (C. Geyer) Java Threads 85
Locks
resolve os inconvenientes da palavra-reservada synchronized implementa lock de alto desempenho com a mesma semntica de memria do que sincronizao suportando timeout mltiplas variveis de condio por lock e interrompimento de threads que esperam por lock Pacote java.util.concurrent.locks
Java Threads 86
Informtica UFRGS
Variveis Atmicas
Variveis Atmicas
permite a utilizao de uma nica varivel sem a necessidade de locks por mltiplas threads boolean compareAndSet(expectedValue, updateValue); altera atomicamente uma varivel para updateValue se ela atualmente tem expectedValue, retornando true se sucesso base para implementao de lock com busy-waiting principais Classes: AtomicBoolean AtomicInteger AtomicLong AtomicReference +info
Programao com Objetos Distribudos (C. Geyer) Java Threads 87
Informtica UFRGS
CyclicBarrier (Barreiras)
Barreiras
permite que um conjunto de threads esperem at um ponto comum a barreira denominada cclica porque pode ser reusada aps a liberao das threads em espera suporta um comando Runnable opcional que executado uma vez por barreira (uso) aps a ltima thread chegar na barreira mas antes de qualquer thread ser liberada +info
Programao com Objetos Distribudos (C. Geyer) Java Threads 88
Informtica UFRGS
CountDownLatch (Trancas)
CountDownLatch (Trancas)
similar a barreiras, a diferena a condio para liberao: no o nmero de threads que esto esperando, mas sim quando um contador especfico chega a zero threads que executarem o wait aps o contador j ter atingido o zero so liberadas automaticamente o contador no resetado automaticamente
+info
Programao com Objetos Distribudos (C. Geyer) Java Threads 89
Informtica UFRGS
Exchanger (Trocadores)
Exchanger (Trocadores)
servem para trocar dados entre threads de forma segura o mtodo exchange chamado com o objeto de dado a ser trocado com outra thread se uma thread j estiver esperando, o mtodo exchange retorna o objeto de dado da outra thread se nenhuma thread estiver esperando, o mtodo exchange ficar esperando por uma
+info
Programao com Objetos Distribudos (C. Geyer) Java Threads 90
Informtica UFRGS
Locks (Trancas)
Informtica UFRGS
Locks (Cont.)
Informtica UFRGS
Bibliografia
Bibliografia
Advanced Synchronization in Java Threads, Part 1. Disponvel por WWW em http://www.onjava.com/pub/a/onjava/excerpt/jthreads3_c h6/index1.html, 2005. (abr. 2005) Concurrency JSR-166 Interest Site. Disponvel por WWW em http://gee.cs.oswego.edu/dl/concurrencyinterest/index.html, 2005. (abr. 2005) Concurrent Programming with J2SE 5.0. Disponvel por WWW em http://java.sun.com/developer/technicalArticles/J2SE/con currency/, 2005. (abr. 2005)
Java Threads 93
Informtica UFRGS
Bibliografia
Bibliografia
J2SE 5.0 in a Nutshell. Disponvel por WWW em http://java.sun.com/developer/technicalArticles/releases/j 2se15/, 2005. (abr. 2005). JDK 5.0 Documentation. Disponvel por WWW em http://java.sun.com/j2se/1.5.0/docs/index.html, 2005. (abr. 2005). JSR 166: Concurrency Utilities. Disponvel por WWW em http://jcp.org/en/jsr/detail?id=166, 2005. (abr. 2005).
Java Threads 94
Informtica UFRGS
Java Threads 95
Informtica UFRGS
Autoria Semforos
Autores
1a verso Gustavo Frainer (frainer@inf.ufrgs.br) Rmulo Rosinha (rbrosinha@inf.ufrgs.br)
Local
disciplinas:PDP e POD II-UFRGS
Java Threads 96
Informtica UFRGS
Construindo um semforo
Construindo um java.util.concurrent.Semaphore:
new Semaphore(int permits) ou new Semaphore(int permits, boolean fair) permits define o valor inicial de semforo esse valor pode ser negativo nesse caso releases (V) devem ser feitos antes que uma thread possa receber uma permisso atravs de um acquire (P)
Java Threads 97
Informtica UFRGS
Construindo um semforo
Construindo um java.util.concurrent.Semaphore:
fair define se o semforo justo ou no: true garante que as threads que invocaram acquire(P) recebem permisso na ordem de chamada do mtodo acquire (FIFO) false nenhuma garantia sobre a ordem de recebimento de permisses feita. um valor true deve ser usado no caso de controle a recursos compartilhados, para impedir que ocorra starvation de uma thread em outros casos um valor de false pode ser mais desejvel, devido ao ganho de desempenho que ocorre neste modo.
Java Threads 98
Informtica UFRGS
Mtodo acquire
Mtodo acquire()
o equivalente do P conforme conceitos de semforos se o nmero de "permisses" de um semforo for maior que 0 o contador diminudo e o mtodo retorna imediatamente se no existir nenhuma permisso disponvel no semforo a thread fica bloqueada at que: outra thread chame release() neste semforo e a thread atual seja a prxima na lista para receber a permisso. outra thread interrompa a thread atual
Java Threads 99
Informtica UFRGS
Mtodo acquire
Informtica UFRGS
Mtodo tryAcquire
Mtodos tryAcquire
os mtodos tryAcquire permitem que uma thread tente adquirir uma permisso e continue a execuo se no conseguir depois de um certo tempo todos eles retornam um valor booleano indicando se foi possvel ou no adquirir a permisso
Informtica UFRGS
Mtodos tryAcquire
verses: boolean tryAcquire() adquire uma permisso do semforo, se uma estiver disponvel boolean tryAcquire(int permits) adquire o nmero de permisses passado, se todas estiverem disponveis boolean tryAcquire(int permits, long timeout, TimeUnit unit) adquire o nmero de permisses dado, se todas ficarem disponveis dentro do tempo passado boolean tryAcquire(long timeout, TimeUnit unit) adquire uma permisso, se uma ficar disponvel dentro do tempo passado
Programao com Objetos Distribudos (C. Geyer) Java Threads 102
Informtica UFRGS
Mtodo release
Mtodo release()
o equivalente de V conforme conceitos de semforos o mtodo release libera uma permisso do semforo (aumenta o contador em um) se alguma thread estiver tentando realizar um acquire, ento uma destas threads selecionada e recebe a permisso uma thread no precisa ter realizado um acquire() antes de realizar um release()
Informtica UFRGS
Mtodo release
Mtodo release()
verses de release() : void release() libera uma permisso void release(int permits) libera o nmero de permisses passado como parmetro
Informtica UFRGS
Mtodos de verificao
Informtica UFRGS
Mtodos de verificao
Informtica UFRGS
Mtodos auxiliares
Mtodos auxiliares
int drainPermits() adquire todas as permisses disponveis imediatamente e retorna quantas permisses foram adquiridas protected void reducePermits(int reduction) reduz o nmero de permisses disponveis pelo nmero indicado pelo parmetro reduction, que deve ser um nmero positivo
Informtica UFRGS
Informtica UFRGS
Exemplo Produtor/Consumidor
Informtica UFRGS
Exemplo Produtor/Consumidor
Informtica UFRGS
Informtica UFRGS
Informtica UFRGS
Exerccios
Exerccios adicionais
A) morte de uma thread os mtodos previstos no pacote Java threads para a suspenso (suspend()) ou trmino de execuo (stop()) no devem ser usados segundo recomendao da documentao da Sun; se usados, podem colocar o programa em um estado inconsistente; descreva uma soluo alternativa para o problema usando comandos normais de Java (atribuio, variveis simples, chamada de mtodo da aplicao, ...); dica: busy waiting
Informtica UFRGS
Exerccios
B) explique a API do recurso semforo introduzido na verso 5 do SDK da Sun http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurre nt/package-summary.html descrio da API compare com semforos entre 1 e 2 pginas C) compare locks do SDK 5 com synchronized idem
Informtica UFRGS
Informtica UFRGS
Informtica UFRGS
Reviso de sincronizao
Reviso de sincronizao
qual a semntica (comportamento) de um objeto acessado por mltiplas threads concorrentemente? quais as questes a serem verificadas e resolvidas pelo programador desse objeto? qual o recurso bsico em Java para obter-se excluso mtua? qual a semntica desse recurso quando usado de forma bsica em objetos? em especial, quais os objetos e mtodos afetados? e em classes? o que deadlock (bloqueio perptuo) e como pode ocorrer em Java no contexto acima?
Java Threads 120
Informtica UFRGS
Reviso de sincronizao
Reviso de sincronizao
como pode obter-se uma seo crtica (excluso mtua) de gro mais fino (mais eficiente)? o que o lock nesses casos? quais os recursos bsicos para sinalizao entre threads em Java? onde ficam as threads bloqueadas? quem acordada? quem recebe o lock aps uma thread ser acordada?
Informtica UFRGS
Reviso de sincronizao
Reviso de sincronizao
os mecanismos acima tem relao com qual mecanismo de sincronizao clssico? qual a diferena bsica na excluso mtua? quais as diferenas principais com relao sinalizao? Cite alguns mecanismos de sincronizao em Java? Porque / como decidir quais usar?
This document was created with Win2PDF available at http://www.win2pdf.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only. This page will not be added after purchasing Win2PDF.