Lista de exerccios sobre threads
1. Escreva a classe PrimeiroExemplo:
public class PrimeiroExemplo implements Runnable {
private int identificador;
// fazer o getter e setter para o atributo identificador
public void run () {
for (int ind = 0; ind < 10000; ind++) {
System.out.println(" PrimeiroExemplo " + identificador + " com valor: " + ind);
}
}
}
Escreva a classe de Teste:
public class Teste {
public static void main(String[] args) {
PrimeiroExemplo p1 = new PrimeiroExemplo();
p1.setIdentificador(1);
Thread t1 = new Thread(p1);
t1.start();
PrimeiroExemplo p2 = new PrimeiroExemplo();
p2.setIdentificador (2);
Thread t2 = new Thread(p2);
t2.start();
}
}
Rode o programa algumas vezes e veja que as respostas aparecem em ordem diferente.
2. Exerccio: considere um simulador de corridas de frmula 1 que
simula uma disputa entre dois pilotos: Hamilton e Fernando
Alonso.
Cada carro funciona de forma independente;
O tempo de cada volta dado por um valor randmico. O programa deve esperar por este
tempo sem fazer nada para ento iniciar a prxima volta;
Ao final da corrida (quando os dois carros completam 5 voltas), o simulador mostra o tempo
acumulado para cada um dos pilotos e aponta o vencedor ou empate.
3. O cenrio de um depsito de caixas. Um produtor armazena as caixas que vai
produzindo e um consumidor retira essas mesmas caixas. A classe apresentada a
seguir corresponde ao Depsito, com os respectivos mtodos armazenar() e
retirar().
public class Deposito {
private int items=0;
private final int capacidade=10;
public int retirar() {
if (items>0) {
items--;
System.out.println("Caixa retirada: Sobram "+items+" caixas");
return 1;
}
return 0;
}
public int colocar() {
if (items<capacidade) {
items++;
System.out.println("Caixa armazenada: passaram a ser "+items+" caixas");
return 1;
}
return 0;
}
public static void main(String[] args) {
Deposito dep = new Deposito();
Produtor p = new Produtor(dep);
Consumidor c = new Consumidor(dep);
//inicia o produtor
//...
//inicia o consumidor
//...
System.out.println("Execuo do main terminada!");
}
Questes:
a) Crie uma classe Produtor e uma classe Consumidor. Ambas devem funcionar como threads. A primeira
deve invocar o mtodo colocar() da classe Depsito, acrescentando caixas ao depsito, enquanto que a
segunda deve invocar o mtodo retirar() da classe Depsito, retirando caixas do depsito. As classes
devem receber, atravs de seus respectivos construtores, uma referncia ao objeto dep, de onde os mtodos
vo ser invocados. A thread Produtor deve produzir itens sucessivamente, enquanto que a thread Consumidor
deve consumi-los sucessivamente.
b) A existncia de threads concorrentes exige a necessidade de sincronizao. Cada objeto, em Java, tem
associado um monitor que garante o acesso exclusivo s sees crticas do objeto, ou seja, s reas
compartilhadas pelas threads. Altere a implementao da classe Depsito para garantir esse acesso exclusivo.
c) Alm do acesso exclusivo s sees crticas, essencial permitir a coordenao entre as threads.
Utilizando os mtodos adequados, altere a implementao do sistema para permitir a devida coordenao
entre os objetos.