Infra-Estrutura de Comunicação
(IF678)
Davi Duarte
Cynthia Raphaella
Ivan França
Jéssica Barbalho
Larissa Paz
Paulo Fernando
Aula Prática 03 – 2011.2
CIn/UFPE
Agenda:
Programação Concorrente (Threads)
 Exercício Chat
 Exercício Selective Repeat

2
Programação Concorrente:

O termo programação concorrente é usado no
sentido abrangente, para designar a programação
paralela e a programação distribuída
3
Objetivos da Programação Concorrente

Reduzir o tempo total de processamento


Aumentar confiabilidade e disponibilidade


múltiplos processadores
processadores distribuídos
Obter especialização de serviços
sistemas operacionais
 simuladores


Implementar aplicações distribuídas

correio eletrônico
4
Programação Concorrente
Fluxo único de execução
Vários fluxos de execução
tarefa 1
tarefa 1
tarefa 2
tarefa 3
tarefa 2
tarefa 3
5
cada fluxo possui uma pilha de execução
Thread

É uma forma de um processo dividir a si mesmo em
duas ou mais tarefas que podem ser executadas
concorrentemente.
6
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 JAVA
public 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 JAVA
public 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
JAVA
public 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_Prati
cas/AulaPratica%203/especifica%e7%e3o_miniprojeto3.pdf
As telas estão disponíveis em:

http://cin.ufpe.br/~ilfn/Monitoria_Comunicacao/Aulas_Prati
cas/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
Download

modificado