Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Programação Orientada a Objetos Professora : Jane * Interface Gráfica com Swing Eventos Aula 12 Professora: Jane Programação Orientada a Objetos Professora : Jane * Objetivo Correção de exercício de thread - teatro (vide aula 11) Sincronização de threads Threads e swing Exercícios de interface gráfica Programação Orientada a Objetos Professora : Jane * Sincronização de threads Motivação A execução de múltiplos threads pode ser perigosa, quando elas competem pelos mesmos recursos. Exemplo : Uma thread que tenta ler uma string, enquanto outra thread está escrevendo nesta mesma string. Dependendo da situação, podem ser obtidos resultados indesejados. Problemas desta natureza podem ser evitados com a utilização de sincronização. Abra o projeto Aula12_threadSic_Exemplo1 e teste-o : 1º) sem synchronized 2º) com synchronized Programação Orientada a Objetos Professora : Jane * Exemplo : Teste sem e com synchronized public class Trabalhador2 { public static void main(String[] args) { Trabalhador joao, maria, ze; Fabrica fabrica; fabrica = new Fabrica(); // cria um objeto da classe Fabrica joao = new Trabalhador("sapato",50, 100, fabrica); // nascimento da thread maria = new Trabalhador("bota", 50, 500, fabrica); // nascimento da thread ze = new Trabalhador("cinto", 50, 250, fabrica); // nascimento da thread joao.start(); // ativa o 1o. thread ze.start(); // ativa o 2o. thread maria.start(); // ativa o 3o. thread } } //fim da classe João, Maria e Zé compartilham os mesmos recursos. Programação Orientada a Objetos Professora : Jane * public class Trabalhador extends Thread // sub-classe de Thread { private String nomeProduto; private int tempoEspera; private int qtdProduto; private Fabrica fabrica; public Trabalhador(String nome, int qtd, int tempo, Fabrica fabrica) { this.nomeProduto = nome; this.qtdProduto = qtd; this.tempoEspera = tempo; this.fabrica = fabrica; } Programação Orientada a Objetos Professora : Jane * public void run() { fabrica.gera(nomeProduto, qtdProduto, tempoEspera); } } // fim da classe Trabalhador NOTE : O objeto fabrica usa o método gera que é synchronized Programação Orientada a Objetos Professora : Jane * xc public class Fabrica { public synchronized void gera(String nomeProduto, int qtd, int tempo) { for (int i = 1; i <= qtd; i++) // Conta a quantidade de produtos { try { Thread.sleep((long) (Math.random() * tempo)); } catch (InterruptedException e) { } System.out.println("i = " + i + " - " + nomeProduto); } // fim for System.out.println("\n* Terminei produto " + nomeProduto); } // fim método gera } // fim da classe Fabrica Programação Orientada a Objetos Professora : Jane * Apenas uma thread de cada vez pode chamar um método synchronized para um objeto em particular. Note que esta mesma thread poderá chamar outros métodos synchronized . Cada objeto contém um “lock” (também chamado monitor) que é, automaticamente, parte do objeto. Quando se chama um método synchronized do objeto, o objeto é “locked” e nenhum outro método synchronized do objeto pode ser chamado até que o primeiro método sincronizado chamado termine e libere o “lock” . Quando o objeto não está mais “locked”, o monitor permite que a thread pronta de prioridade mais alta tente invocar um método synchronized para prosseguir. Há também um único “lock” por classe, de forma que métodos synchronized static podem bloquear um ao outro e evitar acesso simultâneo a dados estáticos (static). NOTA : lock = trancar ou bloquear locked = trancado ou bloqueado Programação Orientada a Objetos Professora : Jane * Exemplo : Teste sem e com synchronized public class Conta { static int saldo = 1000; static int despesa = 0; // static public synchronized void retirar(int valor, int p) // { static public void retirar(int valor, int p) { System.out.println("Saldo inicial = R$" + saldo); System.out.println("Identificacao do processo: " + p); Projeto Aula12_threadSinc_Conta_exemplo2 Programação Orientada a Objetos Professora : Jane * if (valor <= saldo) { System.out.println("Debito = R$" + valor); saldo -= valor; despesa += valor; System.out.println("Total de debitos = R$" + despesa); } else { System.out.println("Debito de R$" + valor + " nao realizado - saldo insuficiente"); } System.out.println("Saldo final = R$" + saldo); System.out.println("***************************"); } }// fim da classe Conta Programação Orientada a Objetos Professora : Jane * public class minhaThread extends Thread //minhaThread é sub-classe de Thread { int id; // Construtor public minhaThread(int n) { id = n; } Programação Orientada a Objetos Professora : Jane * public void run() { for (int i = 0; i < 10; i++) { try { sleep(100); //dorme por 100 milisegundos } catch (InterruptedException e) { } Conta.retirar((int) (Math.random() * 500 ), id); } } // fim run }// fim da classe minhaThread Programação Orientada a Objetos Professora : Jane * public class ExemploConta { public static void main(String [] args) { minhaThread t1, t2; t1 = new minhaThread(1); t2 = new minhaThread(2); t1.start(); t2.start(); } } Programação Orientada a Objetos Professora : Jane * Threads e Swing Teste o projeto Aula12_ThreadSwing_ex1 Tarefa: Use o projeto mencionado acima e crie um botão Parar Relógio para parar o relógio. Para isso, faça um método pararRelogio e implemente o tratamento do evento, adequadamente. Programação Orientada a Objetos Professora : Jane * Exercício de fixação de tabela(passado em aula anterior – ver gabarito) Programação Orientada a Objetos Professora : Jane * Objetivos : Obter a matrícula e a média de um aluno através de 2 textfields e adicionar as entradas em uma tabela, após ser acionado o botão >>>>. Acionada uma linha da tabela, seus dados deverão ser copiados para dois labels à direita da tabela. Veja os labels Matrícula e Média. Eventos : Clique no botão >>>, o que provocará a inserção dos dados dos textfields na tabela. Enter nos textfields, o que provocará a limpeza dos campos de entrada. 3) Seleção de um item da tabela, o que provocará a cópia da matrícula e da média para o label.