Sie sind auf Seite 1von 2

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.

Das könnte Ihnen auch gefallen