threads - dúvida sobre funcionamento do SwingUtilities.invokeLater
Perguntas � threads � dúvida sobre funcionamento do SwingUtilities.invokeLater
dúvida sobre funcionamento do SwingUtilities.invokeLater
Tenho uma dúvida sobre o funcionamento do método SwingUtilities.invokeLater, tenho uma aplicação onde são enviadas mensagens entre duas aplicações e há um intermediador que faz o endereçamento destas mensagens, a minha necessidade é que essas mensagens ocorram de forma assíncrona, ou seja, não precisa ser necessário terminar o processamento de mensagens de um lado para que o outro possa enviar, percebi que o uso do SwingUtilities.invokeLater quando uma mensagem demorava para ser processada de um lado, o mesmo não enviava outras mensagens para outra aplicação, e com Thread implementada da forma comum, isto funciona. Pesquisei no fórum, e encontrei alguém dizendo que o SwingUtilities.invokeLater é para uma plicação swing que não é Thread Safe, logo eu entendi, que as Thread são enfileiradas, executadas depois, mas seguindo uma ordem a qual foram enfileiradas, e não como uma Thread da maneira comum, que é executada independentemente assíncrona em relação a Thread que a startou, é isto mesmo?
Sim e não. Ocorre o enfileiramento das Threads, sim, mas o uso não é para aplicações Swing que não são Thread Safe e, sim, para processamento do próprio Swing, que não é Thread Safe. Por isso existem os métodos invokeLater e invokeAndWait.
Como o SwingUtilities.invokeLater, assim como o invokeAndWait, é utilizado para atualizações na interface gráfica, o seu caso de enviar mensagens deve ser feito por outra Thread e, na hora de atualizar a interface gráfica, utilizar o invokeLater.
[Atualizando] Como você nos afirmou não utilizar o Swing, esqueça o SwingUtilities e parta para o uso de Threads, mas, use os Executors em vez de Threads "cruas".
1448 pontos
certo, mas o que estou confuso é que minha aplicação não envolve interface gráfica e Swing, então gostaria de saber qual a diferença de eu passar as Threads que preciso executar ao invokeLater ou com Threads normais, ou seja qual a diferença entre SwingUtilities.invokeLater(new ProcessMessage(message, sessionId)); e new Thread(new ProcessMessage(message, sessionId)).start(); ?
— Eduardo Vendruscolo 14 de mai de 2013
Se sua aplicação não envolve interface gráfica nem Swing, não use SwingUtilities.invokeLater. Se puder, não use threads "cruas" e sim as classes do pacote java.util.concurrent, que são mais bem comportadas.
A AWT-EventQueue é uma Queue que enfilera as requisições de modificação VISUAL da interface gráfica do Swing. As requisições são "estimuladas" a partir do SwingUtilities ou EventQueue pelos métodos invokeLater ou invokeAndWait. Quando um processamento não vai realizar atualizações visuais ou uma atualização visual não dependa desse processamento, deve-se colocar a mesma em outra Thread. Quando, ao fim da execução da Thread, seja necessário atualizar a interface gráfica, essa alteração deverá ser posta na Queue AWT-EventQueue através de um dos métodos já citados (comumente invokeLater). O uso indiscriminado da EventQueue pode implicar em congelamentos temporários a até deadlocks.
Lembrando que: popular uma informação num JTextfield (por exemplo) é uma atualização gráfica, logo, deverá ser posta na EventQueue. Já, comunicação entre sistemas remotos não. Porém se essa comunicação requerer, ao final, sinalizar ao usuário que algo foi feito, APENAS essa sinalização (que pode ser um Alert ou a exibição de icone, etc) deverá ser posta na EventQueue a partir da própria Thread que você criou.