Threads

13

Click here to load reader

description

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.

Transcript of Threads

Page 1: Threads

Threads

Mario Jorge [email protected]

Page 2: Threads

Pacote java.net

Threads x ProcessosProcessos: tarefas em espaços de endereços diferentes

se comunicam usando pipes oferecidos pelo SOThreads: tarefas dentro do espaço de endereços da

aplicação se comunicam usando pipes fornecidos pela JVM

O suporte a multithreading de Java é nativoMais fácil de usar que em outras linguagens onde não é

um recurso nativo

Page 3: Threads

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 comCotas de tempo (time-slicing)Prioridades (preemption)

Programador pode controlar parcialmente forma de agendamento dos threadsHá dependência de plataforma no agendamento

Page 4: Threads

Aplicação

Em alguns tipos de aplicações, threads adicionais são essenciais. Em outras, podem melhorar o bastante a performance.

Interfaces gráficasEssencial para ter uma interface do usuário que responda

enquanto outra tarefa está sendo executadaRede

Essencial para que servidor possa continuar a esperar por outros clientes enquanto lida com as requisições de cliente conectado.

Page 5: Threads

Criando

Há duas estratégiasHerdar da classe java.lang.ThreadImplementar a interface java.lang.Runnable

Herdar da classe ThreadO objeto é um Thread, e sobrepõe o comportamento

padrão associado à classe ThreadImplementar 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 ThreadO run() deve conter um loop que irá rodar pelo tempo de

vida do thread. Quando o run(), terminar, o thread morre.

Page 6: Threads

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); } }}

Page 7: Threads

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); } }}

Page 8: Threads

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();}

Page 9: Threads

Ciclo de vida

Page 10: Threads

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++; }}

Page 11: Threads

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) {} } }}

Page 12: Threads

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) {} } }}

Page 13: Threads

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 conhecidoEnvie o comando: "GET / HTTP/1.0\n\n"Imprima o resultado

3. Servidor dedicado: escreva um servidor simples queresponda ao cliente com um eco do que foi enviado.