Você está na página 1de 21

Sistemas Distribuídos

Romulo Fagundes Cantanhede


romulofc@unirn.edu.br
Threads em Java
O que são Threads
! Processos:
! Múltiplos programas concorrentes

! São programas em Execução

! Ilusão de Paralelismo

! Problemas com processos


! Pesados: Variáveis de Ambiente, Caches, Buffers, Páginas

! “Difícil” comunicação entre eles

! Threads são processos dentro de processos


! O seu programa é MultiThreaded
! Coletor de Lixo
! Gerenciador da Interface Gráfica

! LightWeight Processes
! Registradores e Pilha
A Classe Thread
! Para criar um Thread
! Crie uma classe que herda Thread
! Funcionamento baseado em três métodos
! public void start();
! Informa ao SO a existência do thread
! Habilita o escalonamento

! public void run();


! O comportamento do Thread
!Aqui vai o seu código (não chamado
explicitamente)
! Única exigência de Implementação
Exemplo
public class MinhaThread extends Thread {
public void run() {
for ( int a = 0; a < 10000;a++) {
System.out.println(getName() + “ “ +a);
}
}
}

public class Main {


public static void main(String args[]) {
for ( int a = 0; a < 5; a++ ) {
MinhaThread t = new MinhaThread();
t.start();
}
}
}
Primo Sequencial
" Faça um programa que conte quantos
números primos existem em um determinado
intervalo
" Entrada: inicio, fim (inteiros)
" Saída: Total de números primos no intervalo

" Dica:
# Para achar um primo teste a divisibilidade de
2 até a raiz do número.
Primo Thread
" Fazer uma aplicação que pergunte em quantas
Threads vai dividir o calculo.
" Baseado no número da entrada, inicie um conjunto
de Threads dividindo o intervalo.

" Exemplo:
#1 – 1000000
# 4 threads
" 1 – 1-250000
" 2 – 250001 – 500000
" 3 – 50001 – 750000
" 750001 – 1000000

" Ao final, mostrar o total de primos no intervalo.


Análise do Exemplo
" Os dois fluxos seguem em paralelo
# A ordem de execução é “imprevisível”
# Não se pode garantir quem terminará primeiro

" Acabou run() ... acabou Thread

" Podemos associar Nomes a Threads


# Construtor passando um String
# Alternativamente void
setName(String )
# Recuperação por: String getName();
Diagrama de Estados

resume,
notify, or
notifyAll
Thread created ready stop finished
start

new yield, or time stop or


run expired complete
stop

running
blocked
suspend,
sleep, or wait
Thread

Várias threads

Scheduler JVM
Úm único
JVM (Java Virtual processo no SO
Machine)
Scheduler SO

SO

Kernel threads

Processadores
Prioridades
! O escalonamento é baseado em prioridades
! Range: 1 .. 10
! Quando maior, maior a prioridade.
Thread.MIN_PRIORITY
Thread.NORM_PRIORITY
Thread.MAX_PRIORITY

! Mudando a prioridade:
! void setPriority(int);
! int getPriority(int);
! Default é a do Thread Pai
Exercício
public class MathThread extends Thread {

public void run() {


double a = 0;
for ( int i = 0; i < 1000000; i++) {
a+= Math.sqrt(i);
}
System.out.println(getName() + “ acabou”);
}
}

public class Main {


public static void main(String args[]) {
for ( int a = 0; a < 5; a++ ) {
MathThread t = new MathThread();
if ( a % 2 == 0 ) {
t.setPriority(Thread.MAX_PRIORITY);
}
t.start();
}
}
}
Sincronização
" Threads são independentes
# Podem atuar sobre o mesmo objeto
" Cada Thread tem pilha própria
# Variáveis de instância são compartilhadas
" Um potencial problema, Threads ....
# Podem “mudar simultaneamente” um campo

public class Counter {


int i = 0;
public void count () {
int limit = i + 100;
while (i++ != limit)
System.out.println(i);
}
}
Synchronized
!Omodificador impede dois threads sobre o
mesmo objeto
public synchronized void count ()
! Parasincronizar apenas um trecho de
código
synchronized(this)
{ int limit = i + 100;
while (i++ != limit)
System.out.println(i);
}
! Para sincronizar uma variável estática
synchronized(getClass())
{
//codigo protegido
}
wait e notify
" synchronized é funcional porque:
# Todo objeto tem um monitor associado
# Os trechos synchronized só são executados quando o thread
obtém esse monitor.
" Modelos de programação concorrente, exigem:
# Verificação de condição dentro de synchronized
# Abandono do trecho sob certa condição
# Ex: Modelo Produtor/Consumidor
" O método wait() faz o thread corrente:
# voluntariamente liberar o monitor
# Entrar numa fila de Waiters pelo objeto
wait e notify
! O método notify() habilita o escalonamento:
! Apenas um (aleatório) dos threads esperando no
objeto

! O método notify() habilita o escalonamento:


! notifyAll() notifica todos waiters no objeto

! Prioridades são utilizadas para a seleção

! Os três métodos:
! Só podem ser chamado de métodos synchronized
! Não têm tratamento de deadlocks

! Use wait() dentro de um loop


! Não confie que a condição foi satisfeita
A interface Runnable
" Como criar Threads em classes que estendem outra
classe?
# O único método do seu código é run()
# Thread implementa a Inteface Runnable
# run() é o único método da interface Runnable

Thread Runnable Thread() {


Runnable t; t = this;
}
start()
run() start() {
........
t.run();
Nova }

run() {
run()
}
A interface Runnable II
" Para tornar qualquer Classe (C) Multithreaded
# Implementar a interface Runnable em C
# Criar um objeto (O) da Classe (C)
# Criar um objeto (T) da Classe Thread passando O
# Chamar o método run sobre o objeto O
" O cenário por trás:
# O campo t do objeto T é instanciado para O
# Isso é correto, pois O implementa Runnable
# Quando chama-se t.start():
" O método O.run() é executado
Um exemplo
implements Runnable
public class myClass implements Runnable
{
public static void main (String a[])
{
myClass mc1 = new myClass();
Thread t1 = new Thread (mc1);
t1.start();
}

public void run() {


for (int i=0; i < 100; i++)
System.out.println (i)
} public void run()
}
Grupos de Threads
" Threads são organizados em grupos
# Os grupos são organizados em uma árvore
" Operações sobre Threads exigem permissão
# Só aplicáveis entre membros do próprio grupo
" Existem pelo menos dois grupos:
# system e main (main-6, AWTUpdater-5)
" Novos threads são criados no grupo do pai
# A menos que especificado o contrário no construtor
" Pode-se criar um novo grupo vinculado a um pai
# O pai deve permitir
" Em geral a permissão é concedida, exceto system
Exercícios

Você também pode gostar