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.