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

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

Transcript of Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos.

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