tópicos especiais de programação orientada a objetos · tópicos especiais de programação...

50
JAVA Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12

Upload: truonganh

Post on 30-Nov-2018

232 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

JAVATópicos Especiais de Programação

Orientada a Objetos

1

sexta-feira, 19 de outubro de 12

Page 2: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

CONJUNTOS DE DADOSCOLEÇÕES

2

sexta-feira, 19 de outubro de 12

Page 3: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

O que são as coleções em Java?

3

sexta-feira, 19 de outubro de 12

Page 4: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

Coleção é um objeto onde podemos agrupar vários elementos. No dia-a-dia nos deparamos com várias situações onde as coleções estão presentes:

4

sexta-feira, 19 de outubro de 12

Page 5: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

Coleção é um objeto onde podemos agrupar vários elementos. No dia-a-dia nos deparamos com várias situações onde as coleções estão presentes:

4

Filas de bancos

sexta-feira, 19 de outubro de 12

Page 6: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

Coleção é um objeto onde podemos agrupar vários elementos. No dia-a-dia nos deparamos com várias situações onde as coleções estão presentes:

4

Filas de bancos

Listas de compras

sexta-feira, 19 de outubro de 12

Page 7: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

Coleção é um objeto onde podemos agrupar vários elementos. No dia-a-dia nos deparamos com várias situações onde as coleções estão presentes:

4

Filas de bancos

Listas de compras

Pilhas de Livros

sexta-feira, 19 de outubro de 12

Page 8: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕESPara agrupar estes vários elementos, a linguagem Java nos fornece algumas classe que facilitam nosso trabalho:

5

sexta-feira, 19 de outubro de 12

Page 9: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕESPara agrupar estes vários elementos, a linguagem Java nos fornece algumas classe que facilitam nosso trabalho:

5

sexta-feira, 19 de outubro de 12

Page 10: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

6

sexta-feira, 19 de outubro de 12

Page 11: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

6

O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções

Collection

sexta-feira, 19 de outubro de 12

Page 12: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

6

O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções

Collection

Está diretamente relacionada com a idéia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos. Usaremos implementações de SortedSet para situações onde desejarmos ordenar os elementos

Set

sexta-feira, 19 de outubro de 12

Page 13: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

6

O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções

Collection

Está diretamente relacionada com a idéia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos. Usaremos implementações de SortedSet para situações onde desejarmos ordenar os elementos

Set

Também chamada de seqüência. É uma coleção ordenada, que ao contrário da inferface Set, pode conter valores duplicados. Além disso, temos controle total sobre a posição onde se encontra cada elemento de nossa coleção, podendo acessar cada um deles pelo índice

List

sexta-feira, 19 de outubro de 12

Page 14: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

6

O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções

Collection

Está diretamente relacionada com a idéia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos. Usaremos implementações de SortedSet para situações onde desejarmos ordenar os elementos

Set

Também chamada de seqüência. É uma coleção ordenada, que ao contrário da inferface Set, pode conter valores duplicados. Além disso, temos controle total sobre a posição onde se encontra cada elemento de nossa coleção, podendo acessar cada um deles pelo índice

List

Normalmente utilizamos esta interface quando queremos uma coleção do tipo FIFO (First-In-First-Out), também conhecida como filaQueue

sexta-feira, 19 de outubro de 12

Page 15: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

6

O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções

Collection

Está diretamente relacionada com a idéia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos. Usaremos implementações de SortedSet para situações onde desejarmos ordenar os elementos

Set

Também chamada de seqüência. É uma coleção ordenada, que ao contrário da inferface Set, pode conter valores duplicados. Além disso, temos controle total sobre a posição onde se encontra cada elemento de nossa coleção, podendo acessar cada um deles pelo índice

List

Normalmente utilizamos esta interface quando queremos uma coleção do tipo FIFO (First-In-First-Out), também conhecida como filaQueue

Vamos utilizá-la quando desejarmos uma relação de chave-valor entre os elementos. Cada chave pode conter apenas um único valor associado. Usaremos SortedMap para situações onde desejarmos ordenar os elementos

Map

sexta-feira, 19 de outubro de 12

Page 16: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

7

List ArrayList

Um ArrayList se compara a uma matriz comum (array), porém por ser um objeto, possui uma série de facilidades que não encontramos em um array.

sexta-feira, 19 de outubro de 12

Page 17: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

7

List ArrayList

Um ArrayList se compara a uma matriz comum (array), porém por ser um objeto, possui uma série de facilidades que não encontramos em um array.

ArrayListx

array

sexta-feira, 19 de outubro de 12

Page 18: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

8

1 Um array tem que saber seu tamanho na hora em que é criado

2 Para inserir um objeto em um array, você tem que especificar o local

new  String[2]

new  ArrayList<String>(  )

minhaLista[1]  =  b;

minhaLista.add(b);

sexta-feira, 19 de outubro de 12

Page 19: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

9

3Os arrays usam uma sintaxe própria que não é empregada em nenhum outro local em Java

4 Os objetos ArrayList são parametrizados (a partir do Java 5.0)

minhaLista[1]

ArrayList<String>

sexta-feira, 19 de outubro de 12

Page 20: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

10

ArrayList

add(Object elem) Adicionará o parâmetro de objeto à listaremove(int index) Removerá o objeto do parâmetro de índiceremove(Object elem) Removerá esse objeto (se ele estiver na ArrayList)contains(Object elem) Retornará ‘verdadeiro’ se houver uma coincidência com o parâmetro de objetoisEmpty( ) Retornará ‘verdadeiro’ se a lista não tiver elementosindexOf(Object element) Retornará o índice do parâmetro de objeto ou -1size( ) Retornará a quantidade de elementos existentes na lista atualmenteget(int index) Retornará o objeto que se encontra atualmente no parâmetro de índice

Exemplo de alguns dos métodos da classe ArrayList

sexta-feira, 19 de outubro de 12

Page 21: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

11

O que podemos fazer com um ArrayList:

1 Criar um objeto ArrayList

ArrayList<Ovo>  minhaLista  =  new  ArrayList<Ovo>();

2 Inserir algo nele

Ovo  o  =  new  Ovo();minhaLista.add(o);

3 Inserir mais alguma coisa nele

Ovo  b  =  new  Ovo();minhaLista.add(b);

sexta-feira, 19 de outubro de 12

Page 22: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

12

O que podemos fazer com um ArrayList:

4 Saber quantos itens existem nele

int  tamanho  =  minhaLista.size();

5 Saber se ele contém algo

boolean  contem  =  minhaLista.contains(o);

6 Saber onde está algo (isto é, seu índice)

int  indice  =  minhaLista.indexOf(b);

sexta-feira, 19 de outubro de 12

Page 23: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

13

O que podemos fazer com um ArrayList:

7 Saber se ele está vazio

boolean  vazio  =  minhaLista.isEmpty();

8 Remover algo dele

minhaLista.remove(o);

sexta-feira, 19 de outubro de 12

Page 24: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

14

Exemplo: Vamos criar uma Jukebox

sexta-feira, 19 de outubro de 12

Page 25: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

15

public class Jukebox {

ArrayList<String> listaMusicas = new ArrayList<String>(); public static void main(String[] args) { new Jukebox().go(); } public void go() { getMusicas(); System.out.println(listaMusicas); } void getMusicas() { try { File arquivoTexto = new File("ListaMusicas.txt"); BufferedReader reader = new BufferedReader(new FileReader(arquivoTexto)); String linha = null; while ((linha = reader.readLine()) != null) { addMusica(linha); } } catch (Exception ex) { ex.printStackTrace(); } } void addMusica(String linhaParaDividir) { String[] partes = linhaParaDividir.split("/"); listaMusicas.add(partes[0]); }}

sexta-feira, 19 de outubro de 12

Page 26: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

16

sexta-feira, 19 de outubro de 12

Page 27: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

17

Mas ArrayList não é a única classe da família Collections.

sexta-feira, 19 de outubro de 12

Page 28: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

18

Mas ArrayList não é a única classe da família Collections.

Classe Descrição

TreeSet Mantém os elementos classificados e não permite duplicatas.

HashMap Permitirá que você armazene e acesse os elementos como pares nome/valor

LinkedListProjetada para fornecer um desempenho melhor quando você inserir ou

excluir elementos do meio do conjunto. (Na prática, geralmente ainda estaremos querendo uma ArrayList)

HashSet Não permite duplicatas no conjunto e, fornecido um elemento, consegue encontrá-lo rapidamente.

LinkedHashMap

Como a classe HashMap, exceto por conseguir lembrar a ordem em que os elementos (pares nome/valor), foram inseridos ou por poder ser

configurada para lembrar a ordem em que os elementos foram acessados na última vez.

sexta-feira, 19 de outubro de 12

Page 29: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

19

Resumindo:

QUANDO A SEQUÊNCIA É IMPORTANTE (SABER A POSIÇÃO DO OBJETO)Set

QUANDO A EXLCUSIVIDADE É IMPORTANTE (NÃO PERMITIR DUPLICATAS)List

QUANDO ENCONTRAR ALGO PELA CHAVE É IMPORTANTE (USAR PARES CHAVE-VALOR)Map

sexta-feira, 19 de outubro de 12

Page 30: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

20

Exemplo de uso da classe HashSet:

import java.util.HashSet;

public class ExemploSet {

public static void main(String[] args) {

HashSet<String> set = new HashSet<String>(); set.add("Dinardo"); set.add("Rosa"); set.add("Dinardo"); set.add("Rafael"); set.add("Luís"); set.add("Rafael"); set.add("Jobson"); set.add("Anderson"); set.add("Rosa"); System.out.println(set);

set.remove("Dinardo"); System.out.println(set); }

}

sexta-feira, 19 de outubro de 12

Page 31: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

COLEÇÕES

21

Exemplo de uso da classe HashMap:import java.util.HashMap;

public class ExemploMap {

public static void main(String[] args) { HashMap<String, Integer> placar = new HashMap<String, Integer>(); placar.put("Daniel", 42); placar.put("Leonardo", 343); placar.put("Victor", 420); System.out.println(placar); System.out.println(placar.get("Leonardo")); }

}

sexta-feira, 19 de outubro de 12

Page 32: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

22

sexta-feira, 19 de outubro de 12

Page 33: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

23

Em várias situações, precisamos “rodar duas coisas ao mesmo tempo”. Imagine um programa que gera um relatório muito grande em PDF. É um processo demorado e, para dar alguma satisfação para o usuário, queremos mostrar uma barra de progresso. Queremos então gerar o PDF e ao mesmo tempo atualizar a barra.

sexta-feira, 19 de outubro de 12

Page 34: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

24

A necessidade de se fazer várias coisas simultaneamente, ao mesmo tempo, paralelamente, aparece frequentemente na computação. Para vários programas distintos, normalmente o próprio sistema operacional gerencia isso através de vários processos em paralelo.Em um programa só (um processo só), se queremos executar coisas em paralelo, normalmente falamos de Threads.

sexta-feira, 19 de outubro de 12

Page 35: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

25

Threads são uma maneira de se programar aplicações com processamento paralelo, ou seja, várias subprocessos executando ao mesmo tempo.As diversas threads que criamos em nossos programas Java podem estar, a qualquer momento, em algum dos estados do ciclo de vida de uma Thread.

sexta-feira, 19 de outubro de 12

Page 36: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

26

Para a verificação do estado de uma Thread deve-se utilizar o método Thread.getState que retorna, os possíveis estados:

•New•Runnable•Blocked•Waiting•Timed Waiting•Terminated

Além do mais, pode-se chamar isAlive():

TRUE significa que o thread está no estado Runnable ou no estado Non-Runnable.

sexta-feira, 19 de outubro de 12

Page 37: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

27

Para uma classe ser executada em paralelismo, ela deve estender a classe java.lang.Thread ou implementar a classe java.lang.Runnable (utilizar a inteface Runnable). Neste caso é possível utilizar a herança para outros métodos, é esta a principal diferença entre os dois métodos.

Toda Thread deve implementar o método public void run( ), que é o inicio da execução dela.

A ordem de execução das threads é totalmente imprevisível, a decisão final de qual thread será executada é realizada pelo sistema operacional. A imprevisibilidade é maior ainda em processadores com múltiplos núcleos.

Thread

Quando uma Thread entra no estado dead, ela não pode ser mais usada e deve ser descartada.

sexta-feira, 19 de outubro de 12

Page 38: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

28

Detalhes de cada estado de uma Thread:

Pronta - Quando criamos uma nova thread e chamamos seu método start() ela entra no estado pronta, ou seja, seu método run() pode ser executado a qualquer momento. É importante observar que chamar start() não faz com que a thread seja executada imediatamente. O que este método faz é deixá-la pronta para execução. Vai depender do gerenciador de threads o momento no qual o método run() da thread recém-criada será executado.

Executando - Quando o método run() de uma thread é finalmente chamado ela entra no estado "executando". Uma thread em execução pode voltar ao estado "pronta" se o seu tempo de CPU expirar ou seu método yield() for chamado. Lembre-se de que chamar Thread.yield() na thread atual faz com que ela gentilmente ceda seu tempo restante de CPU para que as demais threads sejam executadas.

sexta-feira, 19 de outubro de 12

Page 39: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

29

Bloqueada - Uma thread pode entrar no estado "bloqueada", ou seja, se tornar inativa, por várias razões. Ela, ou quaisquer outras threads, pode ter chamado os métodos join(), sleep(), wait() or lock(). Uma thread pode também estar bloqueada aguardando alguma operação de entrada/saída (I/O) ser finalizada. Quando a situação que colocou a thread como bloqueada for revertida ou seu tempo de sleep expirar, ela será reativada e entrará no estado "pronta". Novamente caberá ao gerenciador de threads colocá-la no estado "executando".

Finalizada - Quando todas as instruções contidas no método run() da thread forem concluídas, a thread terá terminado sua tarefa e será finalizada. Uma thread finalizada está "morta". Não há como chamar seu método start() novamente sem criarmos uma nova instância da mesma.

Note que o método run() de uma thread pode ser finalizado em resposta a uma condição de erro ou exceção. Esta situação

também provoca a "morte" de um thread.

sexta-feira, 19 de outubro de 12

Page 40: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

30

public class MinhaThread extends Thread {

public void run() { int i=0; while (true) { i++; System.out.println("Minha Thread:" + i); try { Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } } }}

sexta-feira, 19 de outubro de 12

Page 41: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

31

public class ExecutarThread { public static void main(String[] args) {

MinhaThread th = new MinhaThread(); th.start(); int i=0; while(true) { i++;

try { Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("Programa principal:" + i); if (th != null) { System.out.println("Estado da Thread:" + th.getState()); } else { System.out.println("Estado da Thread: ENCERRADA"); } if (i==14) { th = null; } } }}

sexta-feira, 19 de outubro de 12

Page 42: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

32

sexta-feira, 19 de outubro de 12

Page 43: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

33

public class MinhaRunnable {

public void run() { int i=0; while (true) { i++; System.out.println("Minha Runnable:" + i); try { Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } } }}

sexta-feira, 19 de outubro de 12

Page 44: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

34

public class ExecutarRunnable { public static void main(String[] args) {

MinhaRunnable ru = new MinhaRunnable(); Thread t = new Thread(ru); t.start(); int i=0; while(true) { i++; try { Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("Programa principal:" + i); if (t != null) { System.out.println("Estado da Thread:" + t.getState()); } else { System.out.println("Estado da Thread: ENCERRADA"); } if (i==14) { t = null; } } }}

sexta-feira, 19 de outubro de 12

Page 45: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

35

sexta-feira, 19 de outubro de 12

Page 46: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

36

Thread-safe: é um trecho do código que mantém seu estado válido, mesmo sendo percorrido por múltiplas linhas de execução. Mantém a integridade da classe.

Imaginemos um controle de contas bancárias.

Supondo que em uma conta haviam 100 reais de saldo.Uma thread tenta fazer um saque de 60 reais e uma outra de 80 reais.A primeira thread executa e calcula o saldo restante que será de 40 reais. O processador então decide trocar de thread e passa a execução para a segunda thread. A segunda thread executa e calcula o saldo restante de 20 reais, pois como a primeira thread ainda não atualizou o saldo, para a segunda thread o saldo atual ainda são os 100 reais iniciais.O processador então retorna para primeira thread que atualiza o saldo para 40 reais. Logo, o cliente que tinha 100 reais na conta, sacou 140 e ainda ficou com saldo de 40 reais.Isto é uma violação do estado da classe, logo não é thread-safe.

sexta-feira, 19 de outubro de 12

Page 47: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

37

public class Conta {

private float saldo; public void saque(float quantia) { float saldoRestante = saldo - quantia; if (saldoRestante < 0) { throw new IllegalArgumentException("Sem saldo"); } saldo = saldoRestante; }}

sexta-feira, 19 de outubro de 12

Page 48: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

THREADS

38

Para solucionar este tipo de problema, é necessário implementar mecanismos de thread-safe para garantir a integridade da classe.Uma das maneiras é o uso de métodos e atributos estáticos ou então utilizar o modificador synchronized.No exemplo, a segunda thread, caso fosse utilizado o modificador synchronized, ela esperaria a execução da primeira thread antes de atualizar o saldo.

public class Conta {

private float saldo; public synchronized void saque(float quantia) { float saldoRestante = saldo - quantia; if (saldoRestante < 0) { throw new IllegalArgumentException("Sem saldo"); } saldo = saldoRestante; }}

sexta-feira, 19 de outubro de 12

Page 49: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

BIBLIOGRAFIA

39

•Introdução ao Java, Daniel Destro do Carmo•Use a Cabeça Java, Kathy Sierra e Bert Bates•Certificação Sun para Programador Java 6, Kathy Sierra e Bert Bates

sexta-feira, 19 de outubro de 12

Page 50: Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação Orientada a Objetos 1 sexta-feira, 19 de outubro de 12. CONJUNTOS DE DADOS ... 1 Um

OBRIGADO

40

PROF. EMILIO PARMEGIANI

DOWNLOAD DO MATERIAL

sexta-feira, 19 de outubro de 12