Pergunta

Estive lendo Filthy Rich Clients ultimamente e notado que, embora a versão do Java é 6, não há menção do Quadro Concurrent. Então, eles falam sobre java.util.Timer e javax.swing.Timer mas não sobre o ExecutorService.

Eu li sobre as vantagens de ExecutorService na pergunta " Java Temporizador vs ExecutorService " e decidiu usar o segundo sobre o primeiro. Mas o livro fala sobre javax.swing.Timer e é vantagens de ser específico para o desenvolvimento Swing.

Então, isso significa que, para o desenvolvimento Swing (animação botões etc.), javax.swing.Timer ainda é uma escolha melhor ou existe uma classe relevante no novo Quadro Concurrent que substitui-lo?

Foi útil?

Solução

Bem, o temporizador do balanço, pelo menos, é executado no EDT, assim você não tem que embrulhar tudo com chamadas para invokeLater. Também laços muito bem em com balanço, pois utiliza Ações, ActionListeners e outras classes relacionadas Swing.

Eu ia ficar com temporizador balanço para tarefas relacionadas Swing e usar o novo pacote concorrente para as coisas que não envolve a atualização do GUI.

Tenha um olhar em Usando Timers em aplicações Swing como pode conter mais informações para balanço (sorry) a decisão.

Outras dicas

Eu diria que para o material relacionado balanço simples a melhor escolha é a javax.swing.Timer por causa das vantagens mencionadas aqui .

Note que a tarefa do temporizador Swing é realizada no despacho evento fio. Isto significa que a lata tarefa manipular com segurança componentes, mas também significa que a tarefa deve executar rapidamente.

Por outro lado, se você precisa executar operações de processamento não-swing relacionados ou mais complexos / longa, o ExecutorService é muito robusto e é definitivamente o caminho a percorrer.

Apenas uma sugestão de elaborar sobre o que BRUNO aconselhou, um padrão para tirar partido das excelentes Java 1.5+ utilitários de simultaneidade sem quebrar balanço é ter o seu ExecutorService fazer todo o trabalho pesado (como Bruno disse), mas uma vez que é feito, o fio ExecutorService deve entregar a interação com os componentes de interface reais para o segmento AWT em um Runnable usando um dos seguintes:

  • javax.swing.SwingUtilities.invokeAndWait(Runnable doRun)
  • javax.swing.SwingUtilities.invokeLater(Runnable doRun)

Esses métodos passar o executável a ser executado pela thread AWT.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top