Threads

771 views

Published on

Em Java, usamos a classe Thread do pacote java.lang para criarmos linhas de execução paralelas. A classe Thread recebe como argumento um objeto com o código que desejamos rodar.

Published in: Technology
1 Comment
1 Like
Statistics
Notes
No Downloads
Views
Total views
771
On SlideShare
0
From Embeds
0
Number of Embeds
149
Actions
Shares
0
Downloads
12
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

Threads

  1. 1. Threads Mario Jorge Pereira mariojp@gmail.com
  2. 2. Pacote java.net Threads x Processos Processos: tarefas em espaços de endereços diferentes se comunicam usando pipes oferecidos pelo SO Threads: tarefas dentro do espaço de endereços da aplicação se comunicam usando pipes fornecidos pela JVM O suporte a multithreading de Java é nativo Mais fácil de usar que em outras linguagens onde não é um recurso nativo
  3. 3. O que é um thread Um thread parece e age como um programa individual. Threads, em Java, são objetos. Individualmente, cada thread faz de conta que tem total poder sobre a CPU Sistema garante que, de alguma forma, cada thread tenha acesso à CPU de acordo com Cotas de tempo (time-slicing) Prioridades (preemption) Programador pode controlar parcialmente forma de agendamento dos threads Há dependência de plataforma no agendamento
  4. 4. Aplicação Em alguns tipos de aplicações, threads adicionais são essenciais. Em outras, podem melhorar o bastante a performance. Interfaces gráficas Essencial para ter uma interface do usuário que responda enquanto outra tarefa está sendo executada Rede Essencial para que servidor possa continuar a esperar por outros clientes enquanto lida com as requisições de cliente conectado.
  5. 5. Criando Há duas estratégias Herdar da classe java.lang.Thread Implementar a interface java.lang.Runnable Herdar da classe Thread O objeto é um Thread, e sobrepõe o comportamento padrão associado à classe Thread Implementar a interface Runnable O objeto, que define o comportamento da execução, é passado para um Thread que o executa Nos dois casos Sobreponha o método run() que é o "main()" do Thread O run() deve conter um loop que irá rodar pelo tempo de vida do thread. Quando o run(), terminar, o thread morre.
  6. 6. Exemplo 1 public class Trabalhador extends Thread { private String produto; private int tempo; public Trabalhador(String produto,int tempo) { this.tempo = tempo; this.produto = produto; } public void run(){ for(int i = 0 ; i<50 ; i++ ){ System.out.println(i+" Inicio: "+ produto); try{ this.sleep((long)(Math.random()*tempo)); }catch (InterruptedException ex) { ex.printStackTrace(); } System.out.println(i+" Fim: "+ produto); } } }
  7. 7. Exemplo 2 public class Trabalhador implements Runnable { private String produto; private int tempo; public Trabalhador(String produto,int tempo) { this.tempo = tempo; this.produto = produto; } public void run(){ for(int i = 0 ; i<50 ; i++ ){ System.out.println(i+" Inicio: "+ produto); try{ Thread.sleep((long)(Math.random()*tempo)); }catch (InterruptedException ex) { ex.printStackTrace(); } System.out.println(i+" Fim: "+ produto); } } }
  8. 8. Usando Para o Trabalhador que extende Thread public static void main(String[] args) { Trabalhador t = new Trabalhador("dvd",500); t.start(); } Para o Trabalhador que implementa Runnable public static void main(String[] args) { Trabalhador t = new Trabalhador("cd",1000); Thread thread = new Thread(t); thread.start(); }
  9. 9. Ciclo de vida
  10. 10. Exemplo clássico de comunicação A seguinte classe é uma pilha compartilhada por dois threads. Como os métodos push() e pop() contém código que pode corromper os dados, caso não sejam executados atomicamente, eles são synchronized public class Pilha { private int index = 0; private int[] buffer = new int[30]; public synchronized int pop() { index--; return buffer[index]; } public synchronized void push(int i) { buffer[index] = i; index++; } }
  11. 11. Exemplo clássico de comunicação O objeto abaixo produz 40 componentes em intervalos de 0 a 1 segundo e os tenta armazenar na pilha. public class Produtor implements Runnable { private Pilha pilha; public Produtor(Pilha pilha) { this.pilha = pilha; } public void run() { for (int i = 0; i < 40; i++) { pilha.push(i); try { Thread.sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) {} } } }
  12. 12. Exemplo clássico de comunicação O objeto abaixo consome os 40 componentes da pilha mais lentamente, esperando de 0 a 5 segundos public class Consumidor implements Runnable { Pilha pilha; public Consumidor(Pilha pilha) { this.pilha = pilha; } public void run() { for (int i = 0; i < 40; i++) { System.out.println("Usado: "+ pilha.pop()); try { Thread.sleep((int)(Math.random() * 5000)); } catch (InterruptedException e) {} } } }
  13. 13. Socket e Thread 1. Escreva um programa que descubra e imprima o número IP da sua máquina 2. Escreva um programa que Conecte-se na porta HTTP (geralmente 80) de um servidor conhecido Envie o comando: "GET / HTTP/1.0nn" Imprima o resultado 3. Servidor dedicado: escreva um servidor simples que responda ao cliente com um eco do que foi enviado.

×