Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Linguagem de Programação III Ana Patrícia F. Magalhães Mascarenhas anapatriciamagalhaes@gmail.com 2014.2 Threads e sincronização Agenda Threads Sincronização Exercícios 2 Motivação Muitas vezes precisamos que o computador realize várias atividades em “paralelo” Imagine o servidor da receita federal durante a entrega do imposto de renda. Ele provavelmente terá que receber várias prestações “ao mesmo tempo” Imagine um programa gerando um relatório bem grande em pdf e querendo mostrar para o usuário uma barrinha de progresso com a evolução da geração do relatório... 3 Multiprogramação É possível que a CPU trabalhe com vários programas em um curto espaço de tempo dando ao usuário a idéia de paralelismo. Para isso temos o conceito de processo: “Processo: Programa em execução” Usa um espaço único de endereçamento para seus recursos (códigos, dados, processos filhos) E contém um fluxo de execução (thread) 4 Thread Fluxo único de controle seqüencial dentro de um programa Contém informações a respeito da execução do programa Ex. pilha de execução 5 Threads em Java (1) O java disponibiliza a classe Thread do pacote java.lang para trabalharmos com threads Ex. programa PFD e a barra de progresso 6 public class geraPDF extends Thread{ public void run(){ //logica do programa que gera o pdf } } Public class BarraDeProgresso extends Thread{ public void run(){ // programa para rodar a barra de progresso e atualiza-la } } Threads em Java (2) No método main da nossa aplicação criamos os objetos e mandamos executar O método start inicia a execução da thread 7 public class MeuPrograma{ public static void main(String[] args){ GeraPDF threadDoPdf = new GeraPDF(); threadDoPdf.start(); BarraDeProgresso threadDaBarra = new BarraDeProgresso(); threadDaBarra.start(); } } Escalonamento Quando rodamos vários processos “ao mesmo tempo” o computador usa um escalonador para controlar como esses processos serão executados um pouco de cada vez. O escalonador executa parte de uma thread depois salva o estado da thread e passa para outra thread Esse controle é feito pelo escalonador Para nós a ordem em que as coisas são executadas não tem importância. 8 Exemplo para implementar public class Programa extends Thread{ private int id; public Programa(int id){ this.id=id; } @Override public void run(){ try{ for (int i=0;i<10000;i++){ System.out.println("Programa "+id+ " valor "+i); } catch(Exception e){} } } 9 public class Main { public static void main(String[] args) { // TODO code application logic here Programa p1 = new Programa(1); p1.start(); Programa p2 = new Programa(2); p2.start(); } } Qual a saída do programa? Teste e verifique Cada vez que você rodar vai ter uma saída diferente! Threads dormindo Uma thread pode dormir por alguns segundos Não disputa o processador durante o tempo em que está dormindo Thread.sleep (3*1000); 10 n 10 Exemplo para implementar public class Programa extends Thread{ private int id; public Programa(int id){ this.id=id; } @Override public void run(){ try{ for (int i=0;i<10000;i++){ System.out.println("Programa "+id+ " valor "+i); sleep(1000); } catch(Exception e){} } } 11 public class Main { public static void main(String[] args) { // TODO code application logic here Programa p1 = new Programa(1); p1.start(); Programa p2 = new Programa(2); p2.start(); } } Agora teste novamente Qual a saída? Ciclo de vida de uma thread – Estados da thread Nova (born) A thread acaba de ser criada com new e ainda não está em execução Pronta (Ready- passível de execução) A thread esta pronta para entrar em execução, o SO vai escalonar Em execução (Running) O SO entrega o processador a Thread e ela começa a executar Morta (dead) Thread marcada para ser removida pelo sistema 12 Ciclo de vida de uma thread – outros estados da thread Bloqueada Entra a partir do estado “em execução” Não pode usar o processador mesmo se disponível Ex. se estiver esperando uma operação de I/O Dormindo Entra quando o método sleep é chamado Não pode usar o processador Quando termina o estado sleep vai para o estado pronto (ready). 13 Ciclo de vida de uma thread – outros estados da thread Espera Entra quando wait é chamado em um objeto que a thread está acessando Uma thread em espera torna-se pronta quando o objeto chama notify notifyAll – todas as threads em espera se tornam prontas 14 Prioridade É possível definir prioridades para as threads “ajudando” o SO a escalonar as threads MIN_PRIORITY (constante 1) MAX_PRIORITY (constante 10) NORM_PRIORITY (constante 5) – default Porém não é possível garantir a ordem de execução (depende muito da plataforma) 15 Voltando ao exemplo, vamos definir prioridades public class Programa extends Thread{ private int id; public Programa(int id){ this.id=id; } @Override public void run(){ try{ for (int i=0;i<10000;i++){ System.out.println("Programa "+id+ " valor "+i); } catch(Exception e){} } } 16 public class Main { public static void main(String[] args) { // TODO code application logic here Programa p1 = new Programa(1); p1.setPriority(1); p1.start(); Programa p2 = new Programa(2); p2.setPriority(10); p2.start(); } } Thread Muitas vezes é preciso que o “pseudo paralelismo” aconteça também dentro de um mesmo programa Ex. o sistema de recebimento do imposto de renda no servidor da receita federal deve receber diversas entregas de IR “ao mesmo tempo” 17 Multithread Multithread Multiplas threads num mesmo processo As threads se alternam na CPU dando a idéia de paralelismo Compartilham recursos comuns que precisam estar sincronizados Assim, uma thread pode acessar dados de outra 18 Multithread e Região crítica Um aplicativo possui uma área de memória compartilhada por todas as threads chamada de Região crítica. Uma aplicação confiável deve garantir que apenas uma thread utiliza a região crítica de cada vez (sincronização). 19 Mulithread e região crítica em Java Precisamos sincronizar a parte do sistema que contém a região crítica Java usa o conceito de monitor para fazer a sincronização Um objeto com método Syncronized é o monitor Dentro do método Syncronized apenas uma thread pode executar por vez Se tiver vários métodos syncronized apenas um pode estar ativo 20 public syncronized int meuMetodo(int x) Exemplo usando sincronização 21 // classe para imprimir um contador de 1 a 10000) public class Print { public void imprimir(){ try{ for (int i=0;i<10000;i++){ System.out.println("contador: "+i); // sleep(1000); } } catch(Exception e){ System.out.println("Thread interrompida"); } } } // thread sincronizada public class Programa extends Thread{ private int id; private Print pt; public Programa(Print pt, int id){ this.pt=pt; this.id=id; } @Override public void run(){ synchronized(pt){ pt.imprimir(); } System.out.println("***** Thread "+id+" ******"); } } Exemplo usando sincronização (2) 22 // Programa principal public class Main { public static void main(String[] args) { Print pt = new Print(); Programa p1 = new Programa(pt,1); // p1.setPriority(1); p1.start(); Programa p2 = new Programa(pt,2); //p2.setPriority(10); p2.start(); } } Vamos executar... Exercício Construa um programa cliente e um programa servidor TCP usando thread. O programa cliente deve receber como entrada do usuário dois números e enviar para o servidor O programa servidor deve receber estes dois números, contar quantos pares existem entre esses dois números e enviar a resposta para o cliente. Considerar a possibilidade de receber diversos clientes ao “mesmo tempo” 23 Programação com thread Alguns sites sobre o assunto http://javafree.uol.com.br/artigo/868871/Entendendo-Threads-e-Sincronizacao.html http://www.caelum.com.br/apostila-java-orientacao-objetos/programacao-concorrente-e-threads/ http://www.dimap.ufrn.br/~flavia.delicato/MultithreadingemJavaSem2_2007_aula1.pdf http://www.tutorialspoint.com/java/java_thread_synchronization.htm Servidores e threads http://tutorials.jenkov.com/java-multithreaded-servers/singlethreaded-server.html 24
Compartilhar