Buscar

Threads

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

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais