O que o SwingUtilities.invokeLater faz?

O que o SwingUtilities.invokeLater faz? É apenas atrasar a execução de um bloco de códigos dentro de seu método de run ? Qual é a diferença entre chamar uma ação dentro da function invokeLater ou simplesmente chamá-la no final do encadeamento que queremos executar? Alguém pode me ajudar com o que realmente faz a function invokeLater ?

Como outras respostas disseram, ele executa seu Runnable no encadeamento de despacho de events do AWT. Mas porque você iria querer fazer aquilo? Como as estruturas de dados do Swing não são thread-safe, portanto, para fornecer aos programadores uma forma facilmente acessível de impedir o access simultâneo a eles, os designers do Swing estabeleceram a regra de que todo o código que os acessa deve ser executado no mesmo thread. Isso acontece automaticamente para manipulação de events e exibição de código de manutenção, mas se você iniciou uma ação de longa duração – em um novo thread, é claro – como você pode sinalizar seu progresso ou conclusão? Você tem que modificar um controle Swing, e você tem que fazê-lo a partir do segmento de despacho de events. Daí invokeLater .

Ele executará o código no encadeamento AWT. Que permite modificar a interface gráfica de outros segmentos.

Do Documentos :

Faz com que doRun.run () seja executado de forma assíncrona no encadeamento de dispatch de events do AWT. Isso acontecerá depois que todos os events AWT pendentes forem processados. Esse método deve ser usado quando um encadeamento de aplicativo precisar atualizar a GUI.

Isso seria comentário, mas parece que, desde que …, apenas coisas básicas

1 / crie próprio EDT para atualização correta para a GUI, fe se você for executado algum código usando plain vanilla Thread , java.util.Timer , Executor .. mais aqui

2 / ajuda com o conjunto de foco para o JComponents iof existem alguns ouvintes porque se há fe DocumentListener, então é difícil definir o Focus para o JComponents desejado

3 / bloqueia o bloqueio de execuções de código e move para os extremos do EDT

Como já foi observado, o InvokeLater permite que você chame methods com segurança nas classs swing quando não estiver em execução no EventQueue para começar. No entanto, você pode simplificar seu código e sua vida acessando outros campos e classs somente a partir do EventQueue. Eles podem trabalhar com swing e uns aos outros sem todas as dificuldades de multi-threading. Se você iniciou outro thread, use InvokeLater para retornar ao EventQueue o mais rápido possível e minimizar o número de campos que devem ser sincronizados ou protegidos.

Se você precisar aproveitar ao máximo vários núcleos, precisará reduzir o uso do EventQueue e terá que pagar um grande preço em termos de complexidade.

Note que você recebe uma chamada para o seu método doRun.run () toda vez que chama invokeLater (doRun). Portanto, se você o chamar dez vezes antes que o encadeamento do evento tenha a oportunidade de executar seu processamento, é provável que você receba dez chamadas sucessivas para doRun.run ().