Resolução Exercícios 3 - Sistemas Distribuídos PDF

Title Resolução Exercícios 3 - Sistemas Distribuídos
Course Sistemas de Informação
Institution Universidade Estadual de Montes Claros
Pages 21
File Size 171.7 KB
File Type PDF
Total Downloads 24
Total Views 116

Summary

Resolução Exercícios 3 - Sistemas Distribuídos...


Description

Série de Exercícios 3 Disciplina: Sistemas Distribuídos Prof. Dr. Nilton Alves Maia Aluno: Num: _______ 1) Defina a classe Contador como uma subclasse de Thread, que imprime números de 0 a 10. Crie a classe TesteContador que deve definir o método main que cria e inicia a execução do thread Contador. Teste o resultado executando a classe TesteContador. Resposta: --- Classe Contado.java --package Numero1; /** * @author Marcela Barbosa */ public class Contador extends Thread{ @Override public void run() { for (int i = 0; i 0)) { wait(); } naluno--; } } } vagaEsct--; System.out.println(classe + " - Num: " + pid + " [Entrando]"); } catch (Exception e) { } } public synchronized void out(String classe, int pid) { System.out.println(classe + " - Num: " + pid + " [Saindo]"); vagaEsct++; notifyAll(); }

} --- Classe Pessoa.java --package Numero8; /* * @author Marcela Barbosa */ public class Pessoa extends Thread { String classe; int pid; Estacionamento estc; public Pessoa(String classe, int pid, Estacionamento estc) { this.classe = classe; this.pid = pid; this.estc = estc; } @Override public void run() { try { sleep((int) (Math.random() * 9000)); estc.in(classe, pid); sleep((int) (Math.random() * 7000)); estc.out(classe, pid); } catch (Exception e) { } } } --- Classe Main.java --package Numero8; /* * @author Marcela Barbosa */ public class Main {

public static void main(String[] s) { Estacionamento estc = new Estacionamento(10); Pessoa[] professor = new Pessoa[10]; Pessoa[] funcionario = new Pessoa[15]; Pessoa[] aluno = new Pessoa[30]; for (int i = 0; i < 10; i++) { professor[i] = new Pessoa("Professor", i, estc); professor[i].start(); } for (int i = 0; i < 15; i++) { funcionario[i] = new Pessoa("Funcionario", i, estc); funcionario[i].start(); } for (int i = 0; i < 30; i++) { aluno[i] = new Pessoa("Aluno", i, estc); aluno[i].start(); } } } 9) Implemente uma classe Banco que ofereça os métodos de consulta, crédito e débito de valores sobre um número fixo de contas (com saldo inicial nulo). Utilize o conceito de exclusão mútua. Resposta: /** * * @author Marcela Barbosa */

--- Classe Banco.java --public class Banco { public boolean saque(Conta conta, double valor) { synchronized (conta) { double saldo = conta.getSaldo(); if (saldo < valor) { System.out.println("Saldo insuficiente para o Saque."); return false; }

double novoSaldo = saldo - valor; System.out.println(Thread.currentThread().getName()); System.out.print("Sacou: R$" + valor + "\n"); System.out.print("Saldo Após Saque: R$" + novoSaldo + "\n"); conta.setSaldo(novoSaldo); return true; } } public boolean deposito(Conta conta, double valor) { synchronized (conta) { double saldo = conta.getSaldo(); double novoSaldo = saldo + valor; System.out.println(Thread.currentThread().getName()); System.out.print("Depositou: R$" + valor + "\n"); System.out.print("Saldo Após Depositar: R$" + novoSaldo + "\n"); conta.setSaldo(novoSaldo); return true; } } } --- Classe Cliente. Java--public class Cliente extends Thread { private static Banco banco = new Banco(); private Conta conta = null; private double valor = 100; public Cliente(String nome, Conta conta) { super(nome); this.conta = conta; } @Override public void run() { double total = 0; int flag = 0; for (int i = 0; i < 2; i++) { banco.saque(conta, valor);

total += valor; flag = 1; } for (int i = 0; i < 3; i++) { banco.deposito(conta, valor); total += valor; flag = 2; } if (flag == 1) { System.out.print(getName() + " Sacou total de R$" + total + "\n"); } if (flag == 2) { System.out.print(getName() + " Depositou total de R$" + total + "\n"); } } } --- Classe Conta.java --public class Conta { public double saldo = 0; private Lock lock = new ReentrantLock(); public Conta(double saldo) { this.saldo = saldo; System.out.println("Saldo inicial: R$" + saldo + "\n"); } public synchronized double getSaldo() { lock.lock(); try { return saldo; } finally { lock.unlock(); } } public synchronized void setSaldo(double s) { lock.lock(); try { this.saldo = s;

} finally { lock.unlock(); } } public synchronized void creditarSaldo(double s) { lock.lock(); try { this.saldo = s; } finally { lock.unlock(); } } public synchronized double debitarValor(double valor) { lock.lock(); try { if (this.saldo < valor) { System.out.println("Saldo insuficiente para saque!"); return -1; } else { this.saldo -= valor; return this.saldo; } } finally { lock.unlock(); } } } 10) Acrescente o método transferir à classe Banco como composição das operações de débito e crédito de um valor sobre duas contas. Resposta: /** * * @author Marcela Barbosa */ --- Classe Banco.java --public class Banco {

public boolean saque(Conta conta, double valor) { synchronized (conta) { double saldo = conta.getSaldo(); if (saldo < valor) { System.out.println("Saldo insuficiente para o Saque."); return false; } double novoSaldo = saldo - valor; System.out.println(Thread.currentThread().getName()); System.out.print("Sacou: R$" + valor + "\n"); System.out.print("Saldo Após Saque: R$" + novoSaldo + "\n"); conta.setSaldo(novoSaldo); return true; } } public boolean deposito(Conta conta, double valor) { synchronized (conta) { double saldo = conta.getSaldo(); double novoSaldo = saldo + valor; System.out.println(Thread.currentThread().getName()); System.out.print("Depositou: R$" + valor + "\n"); System.out.print("Saldo Após Depositar: R$" + novoSaldo + "\n"); conta.setSaldo(novoSaldo); return true; } } public boolean transferir(Conta sacaConta, Conta depositaConta, double valor) { synchronized (sacaConta) { double saldo = sacaConta.getSaldo(); if (saldo < valor) { System.out.println("Saldo insuficiente para o Saque."); return false; } double novoSaldo = saldo - valor; System.out.println(Thread.currentThread().getName()); System.out.print("Sacou: R$" + valor + "\n");

System.out.print("Saldo Após Saque (Transferencia): R$" + novoSaldo + "\n"); sacaConta.setSaldo(novoSaldo); double saldo1 = depositaConta.getSaldo(); novoSaldo = saldo1 + valor; System.out.println(Thread.currentThread().getName()); System.out.print("Depositou: R$" + valor + "\n"); System.out.print("Saldo Após Depositar (Transferencia): R$" + novoSaldo + "\n"); depositaConta.setSaldo(novoSaldo); return true; } } } --- Classe Cliente.java --public class Cliente extends Thread { private static Banco banco = new Banco(); private Conta conta = null; private Conta conta1 = null; private double valor = 100; public Cliente(String nome, Conta conta, Conta conta1) { super(nome); this.conta = conta; this.conta1 = conta1; } @Override public void run() { banco.transferir(conta, conta1, valor); } } --- Classe Conta.java --import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class Conta { public double saldo = 0; private Lock lock = new ReentrantLock(); public Conta(double saldo) { this.saldo = saldo; System.out.println("Saldo inicial: R$" + saldo + "\n"); } public synchronized double getSaldo() { lock.lock(); try { return saldo; } finally { lock.unlock(); } } public synchronized void setSaldo(double s) { lock.lock(); try { this.saldo = s; } finally { lock.unlock(); } } public synchronized void creditarSaldo(double s) { lock.lock(); try { this.saldo = s; } finally { lock.unlock(); } } public synchronized double debitarValor(double valor) { lock.lock(); try { if (this.saldo < valor) {

System.out.println("Saldo insuficiente para saque!"); return -1; } else { this.saldo -= valor; return this.saldo; } } finally { lock.unlock(); } } } --- Classe Main.java --public class Main { public static void main(String[] args) { Conta conta = new Conta(3000); Conta conta1 = new Conta(5000); Cliente Cli1 = new Cliente("Mikael", conta, conta1); Cli1.start(); } }...


Similar Free PDFs