Atividade Laboratorio
Por: glaucoglauco • 17/5/2017 • Pesquisas Acadêmicas • 1.607 Palavras (7 Páginas) • 211 Visualizações
Atividade 1 Objetivo: Mostrar um exemplo simples de programa com uma variável compartilhada entre threads, e os possíveis efeitos indesejáveis do acesso compartilhado. Roteiro:
- Abra o arquivo Ex01.java e entenda o que ele faz. Qual saída é esperada para o programa (valor final da variável s)? A execução o valor da variável é mudado.
O valor de s é: 1350639
2. Execute o programa Ex01.java.
3. Execute o programa várias vezes e observe os resultados impressos na tela.
Ele solicita que seja criado uma classe.
4. Os valores impressos foram sempre o valor esperado? Se não, por que isso aconteceu?
São os valores esperados, a cada tarefa executada, ocorre a concatenação de s.
5. Altere o número de threads no programa para 1 (QTD_THREADS 1), compile e execute novamente o programa várias vezes. Os valores impressos foram sempre o esperado? Por quê
Sim. Pois a quantidade de threads foi alterada e diminuiu, recebendo o valor de s por ter somente um laço de repetição.
Atividade 2 Objetivo: Mostrar o comportamento não-determinístico de um programa com três threads. Roteiro:
- Abra o arquivo Ex02.java e entenda o que o programa faz. Quais são os possíveis valores finais da variável y? É possível y terminar com valor 3 (combinação binária dos números 1 e 2)? Por quê? A variável y começa null, é possível sim, pois você pode alterar o valor da variável x na r2 para 3, ou alterar o y para y=1+2.
- Execute o programa várias vezes e observe os resultados impressos na tela. Altere o código do programa modificando a ordem em que as threads são criadas e repita as execuções.
Thread-1 esta executando...
Thread-0 esta executando...
Thread-2 esta executando...
Thread-2 terminou!
Valor de y = null
Thread-0 terminou!
Thread-1 terminou!
Só é alterado a ordem.
Relatório da atividade: Em um arquivo .txt descreva as respostas das questões colocadas e mostre os diferentes resultados obtidos nas execuções realizadas.
Atividade 3 Objetivo: Projetar e implementar uma aplicação concorrente que usa memória compartilhada para permitir a interação entre as diferentes threads da aplicação.
Descrição do problema: A aplicação deve implementar dois comportamentos distintos: (A) produzir dados que são depositados em uma área comum; (B) consumir os dados gerados retirando-os da área comum. Para cada comportamento descrito, implemente uma thread dentro da aplicação. As restrições do problema são: (i) a thread produtora só pode incluir dados em slots vazios da área comum (i.e., não pode ocorrer sobrescrita de dados que ainda não foram consumidos); (ii) a thread consumidora não pode retirar um dado de um slot vazio; (iii) os dados devem ser retirados na mesma ordem em que foram inseridos, i.e., o primeiro dado a ser inserido deve ser o primeiro dado a ser retirado/consumido.
Roteiro:
1. Projete uma solução para a aplicação com uma thread produtora e uma thread consumidora. Use como área comum de depósito de dados um buffer de tamanho N.
2. Planeje como testar/validar a sua aplicação, de que maneira será possível verificar que a solução proposta atende ou não as restrições do problema.
3. Implemente e teste a solução proposta.
4. Estenda a solução anterior considerando a possibilidade de ter um número variável de threads produtoras e consumidoras. Relatório da atividade: Em um arquivo .txt descreva o projeto da solução e dos testes. Acrescente seu nome e numero de matrıcula no relatorio gerado e o envie no moodle, junto com o codigo fonte do programa implementado nessa atividade.
public class Consumidora extends Thread {
private int idConsumidora;
private Buffer pilha;
private int totalConsumir;
private boolean disponivel;
private String conteudo;
public Consumidora(int id, Buffer p, int totalConsumir) {
idConsumidora = id;
pilha = p;
this.totalConsumir = totalConsumir;
}
public void run() {
for (int i = 0; i < totalConsumir; i++) {
pilha.get(idConsumidora);
}
System.out.println("Consumidor #" + idConsumidora + " concluido!");
}
public synchronized String get(int idConsumidora) {
while (disponivel == false) {
try {
System.out.println("Consumidora #" + idConsumidora
+ " esperado...");
wait();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Consumidora #" + idConsumidora + " consumiu: "
+ conteudo);
disponivel = false;
notifyAll();
return conteudo;
}
}
public class Produtora extends Thread {
private int idProdutora;
private Buffer pilha;
private int producaoTotal;
private boolean disponivel;
private int conteudo;
public Produtora(int id, Buffer p, int producaoTotal) {
idProdutora = id;
pilha = p;
this.producaoTotal = producaoTotal;
}
public void run() {
for (int i = 0; i < producaoTotal; i++) {
pilha.set(idProdutora, i);
}
System.out.println("Produtora #" + idProdutora + " concluido!");
}
public synchronized void set(int idProdutora, int valor) {
...