Swing/Multithreading

13 respostas
R

Fala Pessoal,

tenho uma dúvida: imaginem que eu tenho uma aplicação que abre dois JFrames ou JPanels, como quiserem, simultaneamente. Imaginem também que cada uma dessas janelas devem apresentar uma JTable contendo dados provenientes de tabelas distintas de um banco. Essas JTables devem ser atualizadas automaticamente conforme alterações no Banco de Dados.

A única forma de se fazer isso é utilizando Threads ?

[]'s a todos,
Rafael March.

13 Respostas

fantomas

Oi rafaelmarch,

Não minha opinião envolve thread sim.

Mas seria interessante você dizer como é a sua arquitetura para que a galera possa te dar algumas idéias sobre como vc poderia resolver isso sem sobrecarregar o banco de dados.

[]'s

heberfa

Cara isso depende do banco de dados que vc está usando.

o firebird por exemplo tem um comando que pode ser chamado via triger, o “create event”, que serve para isso.

mas nem todos os DB possuem esse tipo de funcionalidade implementado.

qual DB vc está usando?

flw
Heber
http://www.heberfa.com.br

R

Estou utilizando o MS SQL Server…acredito que não vai sobrecarregar o Banco, pois são consultas simples…

fantomas

Oi rafaelmarch,

Se a coisa é client x server então você poderia fazer o seguinte:

Uma thread para a janela A e outra para a janela B, estipula um período para as threads aguardarem até a hora de fazer uma nova leitura na base de dados (refresh).

E ai, acha que rola?

[]'s

jmoreira

Se as Janelas irão ficar lá… “abertas e quietinhas” e, as grids devem serem atualizadas períodicamente, então… alguém ou alguma coisa deve estar olhando o BD de tempos em tempos. E esse alguém, no mundo Swing é uma thread.
No mundo EJB - utilizando um servidor de aplicação JEE, temos os TimeServices que se encarregam de disparar eventos automaticamente para a aplicação.
Outra opção é utilizar o Framework Quartz fazendo uma dobradinha (se necessário) com o padrão Observer/Observable do J2SE.

Grinvon

A thread principal que executa no swing se chama de Event Dispatch, infelizmente swing foi mal projetado a ponto de “perder” o foco da thread, então por isso há muitos problemas em aplicações com uso de threads no swing.

fabiofalci

Isso, a sun recomenda que tudo que for atualizar tela deva ser executado dentro da EventDispatchThread.
Então se vc não estiver nela, use

SwingUtilities.invokeLater(new Runnable() {
	public void run() {
		// 
	}
});

E atualize a tela dentro do run

fabim

Discordo totalmente.
Do meu ponto de vista a maioria das reclamações que ouço a respeito do Swing são provenientes de desconhecimento, e do não entendimento
de como funciona. Por exemplo os Renderers.

victorwss

Discordo totalmente.
Do meu ponto de vista a maioria das reclamações que ouço a respeito do Swing são provenientes de desconhecimento, e do não entendimento
de como funciona. Por exemplo os Renderers.

Mas neste ponto cagaram mesmo. O java 1.1, 1.2 e 1.3 estavam recheados de bugs nisso. Só no 1.4 é que ele se livrou dos bugs de threads. Mas o custo disso foi bastante gambiarra nas classes do swing, um monte de @deprecated, aumento do “java is slow” em alguns pontos e diversas recomendações e procedimentos esotéricos a se tomar poucos conhecidos.

davidbuzatto

Discordo totalmente.
Do meu ponto de vista a maioria das reclamações que ouço a respeito do Swing são provenientes de desconhecimento, e do não entendimento
de como funciona. Por exemplo os Renderers.

Concordo com vc fabiocsi.

Agora quanto a dúvida, não é necessário usar o invokeLater diretamente como sugerido. Se vc estiver usando o Java 6. Existe uma classe chamada SwingWorker que vc deve extender para trabalhar com componentes Swing de forma thread safe. Vc pode também pegar a implementação do SwingWorker caso use uma versão anterior a 6 do Java.
A atualização das tabelas vai ser feita dentro do método doInBackground da sua implementação da SwingWorker.

Já postei um exemplo do SwingWorker aqui no GUJ, dê uma pesquisada. è bem simples de usar.

Até mais!

Shelson

Discordo totalmente.
Do meu ponto de vista a maioria das reclamações que ouço a respeito do Swing são provenientes de desconhecimento, e do não entendimento
de como funciona. Por exemplo os Renderers.

Mas neste ponto cagaram mesmo. O java 1.1, 1.2 e 1.3 estavam recheados de bugs nisso. Só no 1.4 é que ele se livrou dos bugs de threads. Mas o custo disso foi bastante gambiarra nas classes do swing, um monte de @deprecated, aumento do “java is slow” em alguns pontos e diversas recomendações e procedimentos esotéricos a se tomar poucos conhecidos.

Me desculpe, mas estou curioso: Qual a definição de esoterismo em Java ?

ViniGodoy

Acho que exoterismo envolve comandos ou comportamentos obscuros, que normalmente não esperamos por eles.

Exemplos de coisas assim:

  1. O EventQueue.invokeLater, citado acima;
  2. O método wait() pode acordar subitamente (spurious wakeup). Wait(0) espera para sempre (ou até o spurious wakeup ocorrer);
  3. Alguns Streams dão flush automático ao dar close() outros não.
  4. As classes Calendar, GregorianCalendar e Date;
  5. A necessidade de implementar um Document inteiro, só para controlar a quantidade máxima de caracteres de um JTextField;
  6. Tem mais no meu post sensacionalista: http://www.guj.com.br/posts/list/53066.java
Shelson

ViniGodoy:
Acho que exoterismo envolve comandos ou comportamentos obscuros, que normalmente não esperamos por eles.

Exemplos de coisas assim:

  1. O EventQueue.invokeLater, citado acima;
  2. O método wait() pode acordar subitamente (spurious wakeup). Wait(0) espera para sempre (ou até o spurious wakeup ocorrer);
  3. Alguns Streams dão flush automático ao dar close() outros não.
  4. As classes Calendar, GregorianCalendar e Date;
  5. A necessidade de implementar um Document inteiro, só para controlar a quantidade máxima de caracteres de um JTextField;
  6. Tem mais no meu post sensacionalista: http://www.guj.com.br/posts/list/53066.java

sensacional !!! muito bom mesmo :smiley:

acho q vou acender uma vela … :shock:

Criado 27 de junho de 2008
Ultima resposta 6 de jul. de 2008
Respostas 13
Participantes 11