programação concorrente com thread java luiz affonso guedes sistemas distribuidos

21
Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Upload: internet

Post on 17-Apr-2015

115 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Programação Concorrente com Thread Java

Luiz Affonso Guedes

Sistemas Distribuidos

Page 2: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Definições Básicas

• Threads são sub-procesos no sistema operacional.

• É menos custoso gerenciar threads do que processos.

• As linguagens Java e Ada possuem funcionalidades MULTITHREADING na própria estrutura da linguagem.

• C e C++ necessitam de biblioteca especifica para processamento MULTITHREADING – Posix p_thread

Page 3: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Thread em Java

• Em Java, threads são implementadas como uma CLASSE– Pacote java.lang.Thread– É uma extensão da classe Thread– Contrutores:

• public Thread (String nome_da_thread);• public Thread ( ); // o nome sera Thread-#

» Thread-1, Thread-2,…

Page 4: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Principais Métodos– run(): é o método que executa as

atividades de uma THREAD. Quando este método finaliza, a THREAD também termina.

– start(): método que dispara a execução de uma THREAD. Este método chama o método run( ) antes de terminar.

– sleep(int x): método que coloca a THREAD para dormir por x milisegundos.

Page 5: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Principais Métodos

– join( ): método que espera o término da THREAD para qual foi enviada a mensagem para ser liberada.

– interrupt( ): método que interrompe a execução de uma THREAD.

– interrupted( ): método que testa se uma THREAD está ou não interrompida.

Page 6: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Estados de uma Thread em Java

nascimento

pronta

executando

esperando dormindo morta bloqueada

start( )

Alocar um processador

wait( )sleep( ) Fim do

Método run( )

E/S

Fim da E/Snotify( )

notifyAll( )

Término do tempo de dormida

run( )

Page 7: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Prioridade de Thread

• Em Java, a prioridade é determinada com um inteiro entre 1 e 10.

• A prioridade padrão é o valor 5.

• 10 é a maior prioridade e 1 é a menor.

• A THREAD herda a prioridade da THREAD que acriou.

• void setPriority(int prioridade);

• int getPriority( );

Page 8: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Algoritmo de EscalonamentoPrioridade 10

Prioridade 1

Prioridade 9

Prioridade 8

Prioridade 2

Prioridade 3

.

.

.

A B

C

D E F

G

Page 9: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Exemplo 01

• O programa cria 04 threads e as coloca para dormir.

• ThreadBasica é uma extensão da classe Thread.

Page 10: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Exercício 01

– Analise como se chama o método sleep().– Crie n THREADs, onde n é definido pelo

usuário.– Utilize o método join no main para esperar as

THREADs terminarem.• try {

uma_thread.join( ); // uma_thread.join(tempo)

. . . }

catch (InterruptedException e) { … }

Page 11: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Escalonamento de ThreadsPrioridade 10

Prioridade 1

Prioridade 9

Prioridade 8

Prioridade 2

Prioridade 3

.

.

.

A B

C

D E F

G

Page 12: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Exemplo 02

• Prioridades de Threads• Utilize o método setPriority(int) para

mudar a prioridade de threads– Utilize 01 thread com prioridade 1, 01 com

prioridade 09 e as outras com prioridade 5.– Faça com que uma das threads de alta

prioridade durma por 10 ms antes de terminar.

– Faça com que outra thread de alta prioridade faça uma entrada de dado.

Page 13: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Exemplo 03

• Problema Produtor X Consumidor- Com buffer de tamanho 1.- Variáveis compartilhadas.- A solução do problema seria utilizar-se duas

THREADS: 01 consumidor e 01 produtor.- O que ocorre se não houver sincronização

entre a leitura e escrita?

Page 14: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Exemplo 04

• Problema do Produtor X Consumidor com sincronizacao do Buffer.

• Em Java, a sincronização entre threads é feita através do conceito de monitores.

• Monitor é um agrupamento de funções, cujas execuções não podem se dar de forma concorrente.

Page 15: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Exemplo 04

• Utilizar os métodos multuamente excludentes de um objeto como do tipo synchronized em Java.

• Utilizar os métodos wait( ) e notify( ) para bloquear e liberar, respectivamente, as threads.

• Escreva uma classe em Java chamada Semaforo que implente as primitiva P(s) e V(s).

Page 16: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Exemplo 5

• Utilização da Classe Semarofo para resolver o problema de Produtor-Consumidor:– Utilizar dois objetos (instâncias) da classe

Semaforo.• s1 e s2• Valores iniciais: s1 = 1; s2 = 0;

Page 17: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

A interface Runnable

• Para utilizar multithreads em Java é necessário instanciar um objeto de uma classe que estende a classe básicaThread, certo?

• Uma vez que Java não possui herança múltipla, como eu posso utilizar um objeto, cuja classe já é derivada, como no caso da ClasseThread? – public class Filho extends Pai extends Thread {

……………….

} // isto nao eh possivel em Java

Page 18: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

A interface Runnable

• A solução encontrada em Java foi a utilização de uma interface: Runnable– No caso, tem-se de implementar esta

interface, que possui o método run( ).– public class Filho extends Pai implements Runnable– Ao implementar uma interface, a classe se capacita a

ser tratada como se fosse um objeto do tipo da inteface implementada.

• Se a classe Filho implementar a interface Runnable, ela pode ser tratada como tal.

Page 19: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

A interface Runnable

• Cria-se uma thread (Classe Thread), passando para o seu construtor uma referência do objeto que implementa a interface Runnable.– Thread uma_Thread = new Thread(Runnable obj_thread)

– Thread uma_Thread = new Thread(Runnable obj_thread,

String nome_da_thread)

Page 20: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Solução Baseada na Interface Runnable

Thread

Classe BRunnable

referência

Classe A

Page 21: Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos

Solução Baseada em Herança da Classe Thread

Thread

Classe B instanciação