Sunteți pe pagina 1din 32

CEFET-PB / COINFO / CST Sistemas para Internet

Threads em JAVA

Francisco Petrnio Alencar de Medeiros


petronio@cefetpb.edu.br http://arquivos.coinfo.cefetpb.edu.br/~petronio

Programao Concorrente

O mundo real funciona concorrentemente: vrias atividades podem ser executadas em paralelo. Exemplo: uma pessoa pode estar

respirando, e, falando, e escrevendo, e lendo, etc.

Computadores tambm operam concorrentemente. Exemplo: um computador pode estar


compilando um programa, e recebendo uma mensagem, e, imprimindo um arquivo, e, tocando msica, etc.

Objetivos da Programao Concorrente

Reduzir o tempo total de processamento

mltiplos processadores
processadores distribudos sistemas operacionais simuladores

Aumentar confiabilidade e disponibilidade

Obter especializao de servios


Implementar aplicaes distribudas

correio eletrnico

Conceitos de Programao Concorrente

Uma unidade concorrente um componente de um programa que no exige a execuo seqencial, ou seja, que sua execuo seja realizada antes ou aps a execuo de outros componentes do programa O termo programao concorrente usado no sentido abrangente, para designar a programao paralela e a programao distribuda Concorrncia relaciona-se com fluxo de controle: em um programa, existe mais de um fluxo de controle ativo.

Fluxo de Execuo
Execuo seqencial

Comandos de controle de fluxo de execuo Seqencial Condicional Iterativo Requisio de execuo de unidades explcita:chamada de mtodos implcita: ativao de excees Programa controla a ordem de execuo

Execuo concorrente

Cada tarefa uma unidade de execuo autnoma (um thread) Tarefas podem ser totalmente independentes Exemplo: execuo de um mesmo mtodo sobre dois objetos (da mesma classe) Tarefas podem necessitar comunicao Programa no controla a ordem de execuo

Fluxo Seqencial x Concorrente


Fluxo nico de execuo Vrios fluxos de execuo

tarefa 1 tarefa 1 tarefa 2 tarefa 3 cada fluxo possui uma pilha de execuo tarefa 2 tarefa 3

Execuo Concorrente

Execuo concorrente, tambm conhecida como execuo paralela, no significa execuo simultnea A execuo de unidades concorrentes admite as seguintes possibilidades:

O programa geralmente no possui controle sobre a ordem e o tempo de execuo das unidades concorrentes

Pseudo-paralela: Execuo em um nico processador; Paralela: Execuo em vrios processadores que compartilham uma memria; Distribuda: Execuo em vrios processadores independentes, sem compartilhamento de memria.

Unidades Concorrentes

Concorrncia de procedimentos/funes
podem ser tarefas de uma mesma unidade podem ser ativadas de forma implcita/explcita Em ADA, a palavra Task identifica unidade concorrente, como por exemplo: Procedure M; M Task t1; T1 T2 Task t2; ----- end M; A ativao das tarefas concorrentes implcita: quando o procedimento M chamado, as unidades t1 e t2 iniciam automaticamente sua execuo concorrente Precauo contra tarefas/processos rfos

Unidades Concorrentes - Processos

A LP pode adotar um dos seguintes esquemas para explicitar processos:


Exemplo em Java: class Thread {... void run()...} class Concorre extends Thread{ ... } Concorre oc=new Concorre(); Thread oc = new Thread();

Modelo de objetos: herana de comportamento concorrente

Uma construo que indica que aquela unidade um processo. Exemplo, Process MP< .> Uma construo que instancia uma unidade concorrente. Por exemplo: New Process ...(<args>). Ambos os esquemas acima

Conceito de Threads

Definio bsica: Fluxo de controle seqencial isolado dentro de um programa.


Outra denominao: LightWeight Processes

Programas multithreaded: Mltiplos threads concorrentes de execuo num nico programa, realizando vrias tarefas ao mesmo tempo.

Exemplo: programa do usurio + coleta de lixo

Diferentes threads podem executar em diferentes processadores, se disponveis, ou compartilhar um processador nico Diferentes threads no mesmo programa compartilham um ambiente global (memria, processador, registradores, etc.)

Conceito de Threads

As linguagens Java e Ada possuem funcionalidades MULTITHREADING na prpria estrutura da linguagem. C e C++ necessitam de biblioteca especificapara processamento MULTITHREADING Posix p_thread

Threads em JAVA

Em Java, threads so implementadas como uma CLASSE


Pacote java.lang.Thread uma extenso da classe Thread Contrutores:


public Thread (String nome_da_thread); public Thread ( ); // o nome sera Thread

Thread-1, Thread-2,

Principais mtodos

start(): inicia a execuo da thread (mtodo run) suspend(): suspende a execuo da thread que est executando sleep(): faz a thread que est executando dormir por um tempo determinado yield(): faz a thread que est executando dormir por um tempo indeterminado resume(): resume a execuo de uma thread suspensa stop(): termina a execuo de uma thread; a thread no pode ser mais executada.

Principais mtodos

join(): mtodo que espera o trmino da THREAD para qual foi enviada a mensagem para ser liberada. interrupt(): mtodo que interrompe a execuo de uma THREAD. interrupted(): mtodo que testa se uma THREAD est ou no interrompida.

Estados de uma thread

Criao: Neste estado, o processo pai est criando a thread que levada a fila de prontos; Execuo: Neste estado a thread est usando a CPU; Pronto: Neste estado a thread avisa a CPU que pode entrar no estado de execuo e entra na fila de prontos; Bloqueado: Neste estado, por algum motivo, a CPU bloqueia a thread, geralmente enquanto aguarda algum dispositivo de I/O; Trmino: Neste estado so desativados o contexto de hardware e a pilha desalocada. Esperando e Finalizado.

Estados de uma thread

Prioridade de thread

Em Java, a prioridade determinada com um inteiro entre 1 e 10. A prioridade padro 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( );

Prioridade de thread

Em Java, a prioridade determinada com um inteiro entre 1 e 10. A prioridade padro 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( );

Algoritmo de escalonamento

Exemplo 01

O programa cria 04 threads e as coloca para dormir. ThreadBasica uma extenso da classe Thread.

Exerccio 01

Analise como se chama o mtodo sleep(). Crie n THREADs, onde n definido pelo usurio. Utilize o mtodo join no main para esperar as THREADs terminarem.

try { uma_thread.join( ); // uma_thread.join(tempo) ...} catch (InterruptedException e) { }

Escalonamento de Threads
Prioridade 10 Prioridade 9 Prioridade 8 A B C

. . .
Prioridade 3 Prioridade 2 Prioridade 1 G D E F

Exemplo 02

Prioridades de Threads Utilize o mtodo setPriority(int) para mudar a prioridade de threads Mostrar exemplo 02 e execut-lo

Criando Threads (Herana)


public class SimpleThread extends Thread { public SimpleThread(String str) { super(str); } public void run() { [ cdigo do thread ] } }

Exemplo 03

Exemplo que uma thread passa o controle de uma thread para eventuais outras threads. Executar o exemplo.

Sincronizao e Coordenao de Threads

Utilizar os mtodos multuamente excludentes de um objeto como do tipo synchronized em Java. Utilizar os mtodos wait( ) e notify( ) para bloquear e liberar, respectivamente, as threads.

Exemplo sem Sincronizao e Coordenao (Exemplo 04)

Exemplo do problema clssico do Produtor Consumidor Classes: Principal, Produtor, Consumidor e ObjetoBuffer. Execuo do exemplo.

Exemplo com Sincronizao e Coordenao (Exemplo 05)

Exemplo do problema clssico do Produtor Consumidor Utilizao de Sincronizao e Coordenao das Threads. Classes: ProdutorConsumidor, Produtor, Consumidor, ObjetoBuffer e BufferCircular. Execuo do exemplo.

A interface Runnable

Para utilizar multithreads em Java necessrio instanciar um objeto de uma classe que estende a classe bsicaThread, certo? Uma vez que Java no possui herana mltipla, 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

A interface Runnable

A soluo encontrada em Java foi a utilizao de uma interface: Runnable

No caso, tem-se de implementar esta interface, que possui o mtodo 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.

A interface Runnable

Cria-se uma thread (Classe Thread), passando para o seu construtor uma referncia 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)

Exemplo 06

Duas classes com construtores: Pai e Me. Classes Filho e Filha herdam de Me e pai respectivamente e implementam a interface Runnable. Classe de teste chamada running.

S-ar putea să vă placă și