Post on 18-Apr-2015
Infra-Estrutura de Comunicação(IF678)
Aula Prática 03 – 2011.2
CIn/UFPE
Davi DuarteCynthia Raphaella
Ivan FrançaJéssica Barbalho
Larissa Paz Paulo Fernando
2
Agenda:
Programação Concorrente (Threads) Exercício Chat Exercício Selective Repeat
3
Programação Concorrente:
O termo programação concorrente é usado no sentido abrangente, para designar a programação paralela e a programação distribuída
4
Objetivos da Programação Concorrente
Reduzir o tempo total de processamento múltiplos processadores
Aumentar confiabilidade e disponibilidade processadores distribuídos
Obter especialização de serviços sistemas operacionais simuladores
Implementar aplicações distribuídas correio eletrônico
5
Programação Concorrente
Vários fluxos de execuçãoFluxo único de execução
tarefa 1
tarefa 2
tarefa 3
tarefa 1 tarefa 2 tarefa 3
cada fluxo possui uma pilha de execução
6
Thread
É uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrentemente.
Estados de uma Thread
Criação: Neste estado, o processo pai está criando a thread que é levada a fila de prontos;
Execução: Neste estado a thread está usando a CPU;
Pronto: Neste estado a thread avisa a CPU que pode entrar no estado de execução e entra na fila de prontos;
Bloqueado: Neste estado, por algum motivo, a CPU bloqueia a thread, geralmente enquanto aguarda algum dispositivo de I/O;
Término: Neste estado são desativados o contexto de hardware e a pilha é desalocada.
Esperando e Finalizado.
Estados de uma Thread
Principais métodos em Java
start(): inicia a execução da thread (método run)
suspend(): suspende a execução da thread que está executando
sleep(): faz a thread que está executando dormir por um tempo determinado
yield(): faz a thread que está executando dormir por um tempo indeterminado
resume(): resume a execução de uma thread suspensa
stop(): termina a execução de uma thread; a thread não pode ser mais executada.
Principais métodos em Java
join(): método que espera o término da THREAD para qual foi enviada a mensagem para ser liberada.
interrupt(): método que interrompe a execução de uma THREAD.
interrupted(): método que testa se uma THREAD está ou não interrompida.
EXEMPLO DE THREADS EM JAVApublic class Conta {//...
public double saldo = 0;void creditar(double vc) {
saldo = saldo+vc;}void debitar(double vd) {
if(saldo>vd){ saldo = saldo-vd;}
}}
EXEMPLO DE THREADS EM JAVA
public class Credito extends Thread {private Conta conta;private double val;public Credito(Conta c,double v) {
conta = c; val = v;
}public void run() {
conta.creditar(val);}
}
EXEMPLO DE THREADS EM JAVA
public class Debito extends Thread {private Conta conta;private double val;public Debito(Conta c, double v) {
conta = c; val = v;}public void run() {
conta.debitar(val);}
}
EXEMPLO DE THREADS EM JAVA
public class Teste {public static void main(String[] args) {
Conta c = new Conta();c.saldo=12;Thread a = new Credito(c, 23.0);Thread b = new Debito(c, 12.0);a.start(); b.start();System.out.println(c.saldo);
}}
EXEMPLO DE THREADS EM JAVApublic class Receiver implements Runnable{
DatagramSocket rcvSock; DatagramPacket rcvPacket; AtomicBoolean stopped;
int rcvPort;
public Receiver(AtomicBoolean stopped) throws SocketException{
rcvSock = new DatagramSocket(3400);
this.stopped = stopped;
}
public void run(){
while(!stopped.get()){
byte [] receiveData = new byte [20];
rcvPacket = new DatagramPacket(receiveData, receiveData.length);
try {
rcvSock.receive(rcvPacket);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Recebi : " + new String (rcvPacket.getData()));
}
}
}
15
public class Sender implements Runnable{
BlockingQueue <String> blockQueue;
AtomicBoolean stopped;
DatagramSocket sendSock;
DatagramPacket sendPkt;
String ipAmigo; String msg; byte [] buffer;
Sender(AtomicBoolean stopped, BlockingQueue<String> blockQueue){
this.stopped = stopped;
this.blockQueue = blockQueue;
ipAmigo = "localhost";
}
public void run (){
try {
sendSock = new DatagramSocket();
} catch (Exception e) {
}
(continua)
16
while(!stopped.get()){
try {
msg = blockQueue.take();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
sendPkt = new DatagramPacket(msg.getBytes(), msg.getBytes().length,
InetAddress.getByName(ipAmigo), 3400);
sendSock.send(sendPkt);
} catch (Exception e2) {}
}
}
}17
EXEMPLO DE THREADS EM JAVApublic static void main(String[] args) throws Exception {AtomicBoolean stopped = new AtomicBoolean (false);BlockingQueue<String> blockQueue = new ArrayBlockingQueue<String>(5000);Sender sender = new Sender (stopped, blockQueue); Receiver rcver = new Receiver (stopped);blockQueue.add("Testando");blockQueue.add("Essa");blockQueue.add("Mer...");new Thread(sender).start();new Thread(rcver).start();//stopped.set(true);
}
18
CHAT MULTIUSUÁRIO A descrição do projeto se encontra em:
http://cin.ufpe.br/~ilfn/Monitoria_Comunicacao/Aulas_Praticas/AulaPratica%203/especifica%e7%e3o_miniprojeto3.pdf As telas estão disponíveis em:
http://cin.ufpe.br/~ilfn/Monitoria_Comunicacao/Aulas_Praticas/Interface_Java.zip
19
SELECTIVE REPEAT
Implementar uma estrutura Cliente-Servidor:
Baseada no Selective Repeat
Onde é possível realizar transferências de um arquivo qualquer (texto/binário)
A implementação do protocolo deverá ser feita na camada de aplicação, utilizando o protocolo UDP
20
PROJETOS
Tanto o Chat quanto o Selective Repeat devem ser feitos em grupos de 3 pessoas.
Os grupos precisam ser definidos e postados na comunidade do Orkut até o dia 19/10.
A entrega deve ser feita até o dia 4/11, o monitor responsável será indicado na comunidade do Orkut, após a definição das equipes.
21
REFERÊNCIAS http://www.coinfo.cefetpb.edu.br/professor/
petronio/POO/Material/threads.ppt
22