Buscar

Aula 12- POO

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.

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais