230 likes | 320 Views
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.
E N D
Infra-Estrutura de Comunicação(IF678) Davi Duarte CynthiaRaphaella 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 SelectiveRepeat
Programação Concorrente: • O termo programação concorrente é usado no sentido abrangente, para designar a programação paralela e a programação distribuída
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
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 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.
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.
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 publicclass Conta {//... publicdouble saldo = 0; void creditar(doublevc) { saldo = saldo+vc; } void debitar(doublevd) { if(saldo>vd){ saldo = saldo-vd; } } }
Exemplo de threads Em java publicclass Credito extends Thread { private Conta conta; privatedoubleval; public Credito(Conta c,double v) { conta = c; val = v; } publicvoidrun() { conta.creditar(val); } }
Exemplo de threads Em java publicclass Debito extends Thread { private Conta conta; privatedoubleval; public Debito(Conta c, double v) { conta = c; val = v; } publicvoidrun() { 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{ DatagramSocketrcvSock; DatagramPacketrcvPacket; AtomicBooleanstopped; intrcvPort; public Receiver(AtomicBoolean stopped) throws SocketException{ rcvSock = new DatagramSocket(3400); this.stopped = stopped; } publicvoidrun(){ 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())); } } }
public class Sender implements Runnable{ BlockingQueue<String> blockQueue; AtomicBooleanstopped; DatagramSocketsendSock; DatagramPacketsendPkt; StringipAmigo; Stringmsg; byte [] buffer; Sender(AtomicBooleanstopped, BlockingQueue<String> blockQueue){ this.stopped = stopped; this.blockQueue = blockQueue; ipAmigo = "localhost"; } publicvoidrun (){ try { sendSock = new DatagramSocket(); } catch (Exception e) { } (continua)
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) {} } } }
Exemplo de threads Em java public static void main(String[] args) throws Exception { AtomicBooleanstopped = new AtomicBoolean (false); BlockingQueue<String> blockQueue = new ArrayBlockingQueue<String>(5000); Sendersender = 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); }
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
SelectiveRepeat • Implementar uma estrutura Cliente-Servidor: • Baseada no SelectiveRepeat • 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
Projetos • Tanto o Chat quanto o SelectiveRepeat 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.
Referências • http://www.coinfo.cefetpb.edu.br/professor/petronio/POO/Material/threads.ppt