ExecutorService vs Temporizador balanço
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?
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.