Você está na página 1de 123

Informtica UFRGS

Threads - concorrncia

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 2

Informtica UFRGS

Fontes

Essas transparncias foram inicialmente baseadas nas do curso em ingles


Java, by Dr. Stefan Schimpf e Heribert Schlebbe as quais so baseadas nas do curso em alemo Java, by Ralf Reissing and Hartrunt Keller, Institut fr Informatik, Unioversitt Stuttgart

Inmeras revises e adies foram feitas posteriormente

Programao com Objetos Distribudos (C. Geyer)

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.

Programao com Objetos Distribudos (C. Geyer)

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.

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 9

Informtica UFRGS

Concorrncia

Conceitos de threads Java


uma thread Java um fluxo de controle, um processo leve um objeto do tipo Thread equivale a um fluxo de controle de um processo Java (programa em execuo) contendo dados prioridades mtodos do pacote Thread mtodos da aplicao uma thread Java permite a um programa Java ter mais de um fluxo de execuo
Programao com Objetos Distribudos (C. Geyer) Java Threads 10

Informtica UFRGS

Concorrncia

Conceitos de threads Java


uma thread Java possui mtodos como run() cdigo (principal) do fluxo da thread setPriority() altera a prioridade de uma thread start() inicia a execuo da thread join() uma thread (fluxo) espera pelo fim da execuo de outra thread vrios outros mtodos
Programao com Objetos Distribudos (C. Geyer) Java Threads 11

Informtica UFRGS

Concorrncia

Conceitos de threads Java


vantagens das threads (sobre processos) mais eficientes (rpidas), por exemplo, na criao consomem menos recursos (dados -> memria) compartilham dados (objetos em Java) restries das threads contexto limitado a um processo ou programa (usual para objetos Java) a ao de um mtodo limitado s threads do programa exemplo: mtodo wait(): a outra thread deve ser do mesmo programa
Programao com Objetos Distribudos (C. Geyer) Java Threads 12

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 13

Informtica UFRGS

Final de Programa

Final de programa com threads


2 opes Mtodo exit() da classe Runtime foi chamado e o security manager permitiu sua execuo Todas as threads normais morreram Ou por terem terminado, isto , retornaram ao mtodo chamador (ver mais adiante) Ou por terem lanado uma exceo

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Proridades de threads Java


Inicial: igual da me constantes mxima: MAX_PRIORITY = 10 mmima: MIN_ _PRIORITY = 1 normal: NORM _PRIORITY = 5

Programao com Objetos Distribudos (C. Geyer)

Java Threads 17

Informtica UFRGS

Prioridades e nomes

Nomes de threads Java


toda thread tem um nome dado pelo usurio construtores com arg nome ou dado pelo sistema construtores sem arg nome 2 ou mais threads podem ter o mesmo nome

Programao com Objetos Distribudos (C. Geyer)

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()

Programao com Objetos Distribudos (C. Geyer)

Java Threads 19

Informtica UFRGS

Criao de Java threads

Criao de threads Java


dois mtodos A: por herana lembrar que herana simples em Java classe da thread deve ser nova B: por interface permite tornar uma classe existente em thread

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Main ou thread atual

Programao com Objetos Distribudos (C. Geyer)

Java Threads 23

Informtica UFRGS

Concorrncia

Exemplo de criao pelo mtodo A


aplicao criao de 3 threads pelo main cada thread dorme um certo tempo especfico imprime seu nome tempo e nome: dados pelo programador

Programao com Objetos Distribudos (C. Geyer)

Java Threads 24

Informtica UFRGS

Concorrncia

Exemplo de criao pelo mtodo A


public class MyThread extends Thread { private String whoami; private int delay; public MyThread(String name, int d) { whoami = name; delay = d; }

Programao com Objetos Distribudos (C. Geyer)

Java Threads 25

Informtica UFRGS

Concorrncia

public void run() { try { sleep(delay); } catch(InterruptedExcetion e) {} System.out.println(Hello, this is +whoami+ ! ); } }

Programao com Objetos Distribudos (C. Geyer)

Java Threads 26

Informtica UFRGS

Concorrncia

Exemplo de criao pelo mtodo A (cont.)


public class TestThreads { public static void main(String[] args) { MyThread t1, t2, t3; t1 = new MyThread(First, 1000); t2 = new MyThread(Second, 500); t3 = new MyThread(Third, 2000);

Programao com Objetos Distribudos (C. Geyer)

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!

Programao com Objetos Distribudos (C. Geyer)

Java Threads 28

Informtica UFRGS

Concorrncia

Criao thread com interface Runnable


a classe Thread tambm implementada como Runnable Runnable uma interface do ambiente Java cdigo da classe: class ThreadBody implements Runnable { ... public void run() { // cdigo do corpo da thread } }

Programao com Objetos Distribudos (C. Geyer)

Java Threads 29

Informtica UFRGS

Concorrncia

Exemplo de criao thread usando Runnable


cdigo do uso: passa objeto Runnable (ThreadBody) criao de objeto Thread Thread t = new Thread (new ThreadBody()); t.start(); vantagem: classe thread (ThreadBody) pode estender uma outra superclasse diferente da classe Thread

Programao com Objetos Distribudos (C. Geyer)

Java Threads 30

Informtica UFRGS

Concorrncia

Outras caractersticas das threads Java


uma thread Java pode ter mtodos do usurio os mtodos do usrio (e da classe Thread) podem ser chamados antes, durante e depois da execuo do run() se durante: execuo concorrente ao run()

Programao com Objetos Distribudos (C. Geyer)

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();

Programao com Objetos Distribudos (C. Geyer)

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)

Programao com Objetos Distribudos (C. Geyer)

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).

Programao com Objetos Distribudos (C. Geyer)

Java Threads 36

Informtica UFRGS

Consideraes sobre o uso de threads

Consideraes sobre o uso de threads


o uso de threads tem um custo especfico criao, memria, trocas de contexto, sincronizao, ... antes de usa-las analisar e comparar benefcios x custos benefcios eventual paralelismo (vrias cpus) facilidade de expresso de tarefas concorrentes simulaes, jogos, ... tratamento assncrono de I/O e troca de mensagens

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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()

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 44

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


synchronized em mtodo de instncia modifica mtodo declarando que o mesmo faz parte de monitor o monitor o (um) objeto impe excluso mtua (lock/unlock) na execuo de todos os mtodos com synchronized do objeto mtodos sem synchronized no verificam o lock so executados concorrentemente entre si e com relao aos synchronized existe um lock associado a cada objeto da classe
Java Threads 45

Programao com Objetos Distribudos (C. Geyer)

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


synchronized em mtodo de instncia importante: o normal execuo concorrente dos mtodos para ter excluso mtua, preciso usar o synchronized

Programao com Objetos Distribudos (C. Geyer)

Java Threads 46

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


synchronized em mtodos estticos o lock um objeto associado classe independente dos locks por objetos mtodos estticos sem synchronized idem mtodos de instncia

Programao com Objetos Distribudos (C. Geyer)

Java Threads 47

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


deadlock ocorre se (por exemplo) thread A tem lock 1 (associado a objeto x) thread B tem lock 2 (associado a objeto y) thread A pede lock 2 chama mtodo de y thread B pede lock 1 chama mtodo de x no ocorre se thread tem lock 1 chama outro mtodo associado ao mesmo lock mtodo do mesmo objeto
Programao com Objetos Distribudos (C. Geyer) Java Threads 48

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


synchronized em bloco de comandos esqueleto de cdigo em mtodo: ... synchronized(objetoQualquer) { ... bloco de comandos ... } ... objetoQualquer funciona como um lock todos os blocos synchronized com o mesmo objetoQualquer so executados de forma atmica vantagem: seo crtica mais fina (menor) -> melhor desempenho
Programao com Objetos Distribudos (C. Geyer) Java Threads 49

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


synchronized em bloco de comandos o objeto lock (objetoQualquer) pode ser um objeto externo ao objeto onde est inserido o cdigo sincronizado nesse caso, pode-se expressar blocos independentes, em diferentes objetos e classes, mas compartilhando o mesmo lock condio: passar o objeto lock a todos os objetos com o mesmo bloco na construo, por exemplo

Programao com Objetos Distribudos (C. Geyer)

Java Threads 50

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


synchronized em bloco de comandos em mtodos estticos com varivel de classe obrigatoriamente: mtodo esttico no tem acesso direto a variveis de instncias ou objeto passado como argumento em mtodos de instncia com varivel de classe opcional: controla acesso a variveis estticas com varivel de instncia para controlar variveis de classe: usar objeto lock nico em todos os objetos
Programao com Objetos Distribudos (C. Geyer) Java Threads 51

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


synchronized em bloco de comandos observao o lock est sempre associado a um objeto e no a uma varivel (um nome simblico em um nico contexto - objeto) um objeto pode estar sendo referenciado em n variveis (usual em OO)

Programao com Objetos Distribudos (C. Geyer)

Java Threads 52

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


wait() mtodo: inclui a thread em execuo na lista de espera do monitor e permite a execuo de outra thread notify() mtodo: acorda uma thread da lista de espera do monitor a condio de somente uma thread no monitor continua vlida acorda qual thread?: a que espera h mais tempo (escalonamento justo)?

Programao com Objetos Distribudos (C. Geyer)

Java Threads 53

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


notify() caso exista, escolhe-se uma thread de forma arbitrria, remove-se a thread da fila associada (lock) e coloca-se a thread em fila de ready a thread corrente no perde o lock (estado running) a thread deve obter o lock para continuar sua execuo em algum momento posterior nesse momento o lock (certamente) est com a thread que executou o notify, entretanto uma outra thread pode obter antes o lock

Programao com Objetos Distribudos (C. Geyer)

Java Threads 54

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


notifyall diferena: acorda todas as threads bloqueadas na fila do lock associado ao notifyall wait duas verses com time-out passado o tempo, a thread (ou threads) acordada automaticamente wait e notify runtime verifica se notify e wait esto dentro do bloco (ou mtodo inteiro) sincronizado no verifica se o lock externo

Programao com Objetos Distribudos (C. Geyer)

Java Threads 55

Informtica UFRGS

Sincronizao

Sincronizao: modificadores e mtodos bsicos


wait/notify em mtodos estticos wait/notify so mtodos no estticos e finais no podem ser reescritos no podem ser chamados pelo nome da classe alternativa em bloco synchronized em mtodo esttico usar um objeto comum a toda a classe um objeto do tipo Class, inicializado com o objeto da classe especfica Class c = AlgumaClasse.class um objeto nico passado em todas as chamadas dos mtodos estticos (argumento)
Programao com Objetos Distribudos (C. Geyer) Java Threads 56

Informtica UFRGS

Consideraes sobre o uso de sincronizao

Consideraes sobre o uso de sincronizao


desenvolvimento conservativo inicialmente coloque synchronized em todos os mtodos das classes com objetos compartilhados teste e verifique a correo do programa teste e analise o desempenho do programa se desempenho ruim reexamine o cdigo procurando mtodos que no precisem de synchronized sees crticas mais finas que um mtodo, isto , uso de bloco synchronized

Programao com Objetos Distribudos (C. Geyer)

Java Threads 57

Informtica UFRGS

Exemplo Buffer

Exemplo: classe que implementa uma fila


conceito de fila: ordem FIFO: First In, First Out incluso (append): no fim (tail) da fila retirada (get): do incio (head) da fila fila monothread se a fila est vazia em retirada: retorna um aviso se a fila est cheia em incluso: idem

Programao com Objetos Distribudos (C. Geyer)

Java Threads 58

Informtica UFRGS

Exemplo Buffer

Exemplo: classe que implementa uma fila


fila multithread usurio ou cliente (processo, thread): espera em caso de exceo fila vazia em retirada: at haver incluso fila cheia: considera-se buffer ilimitado concorrncia possvel nos acessos a fila: head, tail, ... vrias threads inserindo e excluindo elementos

Programao com Objetos Distribudos (C. Geyer)

Java Threads 59

Informtica UFRGS

Exemplo Buffer

Exemplo: classe que implementa uma fila (cont.)


fonte: Arnold, K. and Gosling, J. The Java Language. Addison-Wesley, 1996. classe Queue { // first and last element of the queue // structure: value of element and pointer to next elem. Element head, tail;

Programao com Objetos Distribudos (C. Geyer)

Java Threads 60

Informtica UFRGS

Exemplo Buffer

Exemplo: classe que implementa uma fila (cont.)


// inserts element at the end of the queue public synchronized void append(Element p) { if (tail == null) // if queue is empty: simple case head = p; // first element is the new element else tail.next = p; // last elem. points to new element p.next = null; tail = p; notify(); } // next of last element is null // last element is the new element // notify that 1 element arrived

Programao com Objetos Distribudos (C. Geyer)

Java Threads 61

Informtica UFRGS

Exemplo Buffer

Exemplo: classe que implementa uma fila (cont.)


// gets an element of queue public synchronized Element get() { try { while (head == null) // if queue is empty? wait(); // wait for an element } catch (InterruptedException e) { return null; }

Programao com Objetos Distribudos (C. Geyer)

Java Threads 62

Informtica UFRGS

Exemplo Buffer

Exemplo: classe que implementa uma fila (cont.)


Element p = head; head = head.next; if (head == null) tail = null; return p; } } // save first element // take out of queue // queue is empty? // last element null

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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; }

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 68

Informtica UFRGS

Controle de threads

Controle de threads: outros mtodos nativos


observaes esses mtodos so em geral chamados por outra thread (objeto) fazendo referncia a uma segunda thread (objeto) exemplo: em thread a sobre thread b b.stop(); start() inicia execuo da thread principal (run) do objeto JVM chama o mtodo run()

Programao com Objetos Distribudos (C. Geyer)

Java Threads 69

Informtica UFRGS

Controle de threads

Controle de threads: outros mtodos nativos


stop() fora a prpria thread a terminar sua execuo isAlive() testa se a thread foi iniciada e ainda no terminou suspend() suspende a thread at ser reativada (resume())

Programao com Objetos Distribudos (C. Geyer)

Java Threads 70

Informtica UFRGS

Controle de threads

Controle de threads: outros mtodos nativos (cont.)


resume() reativa thread suspensa anteriormente sleep(long ml) a thread colocada em espera (dormindo) por ml milisegundos a thread no abandona o monitor (synchronized)

Programao com Objetos Distribudos (C. Geyer)

Java Threads 71

Informtica UFRGS

Controle de threads

Controle de threads: outros mtodos nativos


os mtodos abaixo foram deprecated stop(), suspend(), resume() podem provocar erros de programao de difcil depurao http://java.sun.com/javase/6/docs/technotes/guides/concu rrency/threadPrimitiveDeprecation.html

Programao com Objetos Distribudos (C. Geyer)

Java Threads 72

Informtica UFRGS

Controle de threads

Controle de threads: outros mtodos nativos


os mtodos abaixo foram deprecated por exemplo ao ser morta (stop()) uma thread deveria liberar todos os monitores (locks) um desses monitores pode estar em um estado inconsistente variveis com estado inconsistente o programador poderia desenvolver cdigo para corrigir o estado das variveis tarefa que pode ser extremamente complexa

Programao com Objetos Distribudos (C. Geyer)

Java Threads 73

Informtica UFRGS

Controle de threads

Threads e o coletor de lixo (garbage collector)


objeto normal coletado quando no houver nenhuma referncia ao mesmo objeto Thread coletado quando no houver nenhuma referncia ao mesmo E execuo da thread tiver terminado

Programao com Objetos Distribudos (C. Geyer)

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)

Programao com Objetos Distribudos (C. Geyer)

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)

Programao com Objetos Distribudos (C. Geyer)

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)

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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()

Programao com Objetos Distribudos (C. Geyer)

Java Threads 80

Informtica UFRGS

Novos Recursos SDK 5

Novos recursos na verso 5 do SDK da Sun


http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurren t/package-summary.html pacote java.util.concurrent diversas novas classes, interfaces, excees, ..., para programao concorrente alguns recursos classe semforo locks (mais flexveis que synchronized) barreiras

Programao com Objetos Distribudos (C. Geyer)

Java Threads 81

Informtica UFRGS

Outros Mecanismos de Sincronizao do J2SE 5

Programao com Objetos Distribudos (C. Geyer)

Java Threads 82

Informtica UFRGS

Autoria

Autores
Cristiano Andr da Costa Alan Carvalho Assis

Local
disciplinas: PDP e POD II-UFRGS

Programao com Objetos Distribudos (C. Geyer)

Java Threads 83

Informtica UFRGS

Concorrncia no JDK 5.0

JSR (Java Specification Requests) 166


conjunto de utilitrios de nvel mdio que fornecem funcionalidade necessria em programas concorrentes proposto por Doug Lea incorporado no JDK 5.0 principais contribuies construtores de threads de alto nvel, incluindo executores (thread task framework) filas seguras de threads Timers locks (incluindo atmicos) e outras primitivas de sincronizao (como semforos)

Pacote java.util.concurrent.*
Programao com Objetos Distribudos (C. Geyer) Java Threads 84

Informtica UFRGS

Novos Mecanismos de Sincronizao

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

Informtica Novos UFRGS

Mecanismos de Sincronizao (Cont.)

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

Programao com Objetos Distribudos (C. Geyer)

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)

Lock (mais detalhes)


implementao de excluso mtua para mltiplas threads substitui o uso de mtodos e blocos Syncronized Permite chain lock: adquire A, depois B, libera A, adquire C, ... exemplo de Uso de Lock Lock l = new Lock(); l.lock(); try { //acesso protegido pelo lock } finally { l.unlock(); } +info
Programao com Objetos Distribudos (C. Geyer) Java Threads 91

Informtica UFRGS

Locks (Cont.)

Locks (mais detalhes)


ReentrantLock pode ser justo: usar fila FIFO +info define os mtodos isLocked e getLockQueueLength ReadWriteLock pode permitir vrias threads acessarem o mesmo objeto para leitura ou somente uma para escrita +info Condition adiciona variveis condicionais uma thread suspende a execuo at ser notificada por outra de que uma condio ocorreu +info
Programao com Objetos Distribudos (C. Geyer) Java Threads 92

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)

Programao com Objetos Distribudos (C. Geyer)

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).

Programao com Objetos Distribudos (C. Geyer)

Java Threads 94

Informtica UFRGS

Semforos J2SE 5.0

Estudo da API e comparao com definio clssica

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

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)

Programao com Objetos Distribudos (C. Geyer)

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.

Programao com Objetos Distribudos (C. Geyer)

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 99

Informtica UFRGS

Mtodo acquire

Verses do mtodo acquire:


void acquire() void acquire(int permits) ao invs de adquirir apenas uma permisso adquire o nmero de permisses do parmetro permits a thread bloqueada at conseguir todas as permisses solicitadas void acquireUninterruptibly() similar ao mtodo acima, mas neste mtodo a thread no pode ser interrompida void acquireUninterruptibly(int permits) similar ao mtodo acima, mas neste mtodo a thread no pode ser interrompida
Programao com Objetos Distribudos (C. Geyer) Java Threads 100

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 101

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()

Programao com Objetos Distribudos (C. Geyer)

Java Threads 103

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 104

Informtica UFRGS

Mtodos de verificao

Mtodos de verificao de estado do semforo


int availablePermits() retorna o nmero de permisses disponveis no semforo protected Collection<Thread> getQueuedThreads() retorna uma coleo com as Threads que podem estar tentando adquirir uma permisso neste semforo int getQueueLength() retorna uma estimativa do nmero de threads tentando adquirir uma permisso neste semforo

Programao com Objetos Distribudos (C. Geyer)

Java Threads 105

Informtica UFRGS

Mtodos de verificao

Mtodos de verificao de estado do semforo


boolean hasQueuedThreads() verifica se alguma thread est tentando adquirir uma permisso neste semforo. boolean isFair() retorna true se o semforo for justo.

Programao com Objetos Distribudos (C. Geyer)

Java Threads 106

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 107

Informtica UFRGS

Exemplo Seo Crtica

Exemplo 1: Um objeto que controla o acesso a uma seo crtica


class Exclusao { private final Semaphore livre = new Semaphore(1, true); public Object acessaSecaoCritica() throws InterruptedException { livre.acquire(); //faz acesso a seo critca; livre.release(); } }

Programao com Objetos Distribudos (C. Geyer)

Java Threads 108

Informtica UFRGS

Exemplo Produtor/Consumidor

Exemplo 2: Produtores Consumidores (Sun)


class Pool { private static final MAX_AVAILABLE = 100; protected Object[] items = new Object[10]; protected boolean[] used = new boolean[MAX_AVAILABLE]; private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

Programao com Objetos Distribudos (C. Geyer)

Java Threads 109

Informtica UFRGS

Exemplo Produtor/Consumidor

Exemplo 2: Produtores Consumidores (Sun)


public Object getItem() throws InterruptedException { available.acquire(); return getNextAvailableItem(); } public void putItem(Object x) { if (markAsUnused(x)) available.release(); }

Programao com Objetos Distribudos (C. Geyer)

Java Threads 110

Informtica Exemplo UFRGS

2: Produtores Consumidores (Sun)

Exemplo 2: Produtores Consumidores (Sun)


protected synchronized Object getNextAvailableItem() { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (!used[i]) { used[i] = true; return items[i]; } } return null; // not reached }

Programao com Objetos Distribudos (C. Geyer)

Java Threads 111

Exemplo 2: Produtores Consumidores (Sun)


protected synchronized boolean markAsUnused(Object item) { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (item == items[i]) { if (used[i]) { used[i] = false; return true; } else return false; } } return false; } }

Informtica Exemplo UFRGS

2: Produtores Consumidores (Sun)

Programao com Objetos Distribudos (C. Geyer)

Java Threads 112

Informtica Exemplo UFRGS

2: Produtores Consumidores (Sun)

Exemplo 2: Produtores Consumidores (Sun)


o mais interessante de se notar neste exemplo que a thread no est em um mtodo sincronizado quando ela chama acquire e release isto importante para permitir que vrias threads faam acquire e que enquanto uma thread est trancada no acquire outra ainda assim possa colocar um item e realizar um release o semforo controla a sincronizao necessria para restringir o acesso fila independentemente da sincronizao necessria para manter a consistncia da fila
Java Threads 113

Programao com Objetos Distribudos (C. Geyer)

Informtica UFRGS

Comparao com conceito de semforos

Comparao entre Semaphore e a definio clssica de semforos


Semaphore basicamente uma verso orientada a objetos da definio clssica de semforos onde P e V foram substitudos pelos mtodos do prprio objeto semforo acquire() e release() Semaphore entretanto, possui alguns mtodos que no tm equivalente nos semforos clssicos o principal sendo tryAcquire()

Programao com Objetos Distribudos (C. Geyer)

Java Threads 114

Informtica UFRGS

Comparao com conceito de semforos

Comparao entre Semaphore e a definio clssica de semforos


nos Semaphores o contador tambm no pode ser simplesmente colocado em algum valor arbitrrio depois da criao mas possvel manipular este contador atravs de reducePermits() e de releases()

Programao com Objetos Distribudos (C. Geyer)

Java Threads 115

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 116

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

Programao com Objetos Distribudos (C. Geyer)

Java Threads 117

Informtica UFRGS

Reviso Java threads

Reviso de Java threads


O que uma Java thread? Para que serve? Aplicaes? Quando deve ser usada? Desvantagens das threads? Quantos fluxos de execuo possui? Outros atributos de uma Java thread? Quem escalona as Java threads? Qual o tipo de escalonamento?

Programao com Objetos Distribudos (C. Geyer)

Java Threads 118

Informtica UFRGS

Reviso Java threads

Reviso de Java threads


Quais os passos de criao por herana? Como/quando uma Java thread ativada? Quais os passos de criao por interface? Qual a vantagem de criao por interface? Uma Java thread pode ter mtodos do usurio?

Programao com Objetos Distribudos (C. Geyer)

Java Threads 119

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

Programao com Objetos Distribudos (C. Geyer)

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?

Programao com Objetos Distribudos (C. Geyer)

Java Threads 121

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?

Programao com Objetos Distribudos (C. Geyer)

Java Threads 122

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.

Você também pode gostar