web-dev-qa-db-fra.com

Que fait SwingUtilities.invokeLater?

Qu'est-ce que SwingUtilities.invokeLater faire? Est-ce que cela retarde simplement l'exécution d'un bloc de codes à l'intérieur de sa méthode run? Quelle est la différence entre appeler une action dans la fonction invokeLater ou simplement l'appeler à la fin du thread que nous voulons exécuter? Quelqu'un peut-il m'aider sur ce que fait vraiment la fonction invokeLater?

37
user633784

Comme d'autres réponses l'ont dit, il exécute votre Runnable sur le thread de répartition des événements AWT. Mais pourquoi tu veux faire ça? Étant donné que les structures de données Swing ne sont pas adaptées aux threads, afin de fournir aux programmeurs un moyen facilement réalisable d'empêcher l'accès simultané à celles-ci, les concepteurs Swing ont établi la règle selon laquelle tout le code qui y accède doit s'exécuter sur le même thread. Cela se produit automatiquement pour la gestion des événements et l'affichage du code de maintenance, mais si vous avez lancé une action de longue durée - sur un nouveau thread, bien sûr - comment pouvez-vous signaler sa progression ou son achèvement? Vous devez modifier un contrôle Swing, et vous devez le faire à partir du thread de répartition des événements. D'où invokeLater.

27
Maurice Naftalin

Il exécutera le morceau de code sur le thread AWT. Ce qui vous permet de modifier l'interface graphique à partir d'autres threads.

De Docs :

Provoque l'exécution asynchrone de doRun.run () sur le thread de distribution d'événements AWT. Cela se produira une fois que tous les événements AWT en attente auront été traités. Cette méthode doit être utilisée lorsqu'un thread d'application doit mettre à jour l'interface graphique.

9
MByD

Comme déjà noté, InvokeLater vous permet d'appeler en toute sécurité des méthodes dans des classes swing lorsque vous n'êtes pas en cours d'exécution sur EventQueue pour commencer. Cependant, vous pouvez simplifier votre code et votre vie en accédant à d'autres champs et classes niquement à partir de EventQueue. Ils peuvent travailler avec swing et entre eux sans tous les tracas du multi-threading. Si vous avez démarré un autre thread, utilisez InvokeLater pour revenir à EventQueue aussi rapidement que possible et minimiser le nombre de champs qui doivent être synchronisés ou autrement protégés.

Si vous devez tirer le meilleur parti de plusieurs cœurs, vous devrez réduire votre utilisation de EventQueue et vous devrez payer un prix élevé en complexité.

2
RalphChapin

ce serait un commentaire, mais il semble aussi long que ..., juste des trucs de base

1/créer son propre EDT pour une mise à jour correcte de l'interface graphique, par exemple si vous exécutez du code en utilisant plain Vanilla Thread , Java.util.Timer , Executor .. more here =

2/aide à régler Focus sur JComponents iof il y en a Listeners parce que s'il y a f.e. DocumentListener alors vous avez du mal à définir Focus sur le JComponents souhaité

3/retarder les exécutions de code et les déplacer aux extrémités de l'EDT

2
mKorbel

Notez que vous obtenez finalement un appel à votre méthode doRun.run () pour chaque fois que vous appelez invokeLater (doRun). Donc, si vous l'appelez dix fois avant que le thread d'événement n'ait la possibilité d'effectuer son traitement, vous obtiendrez probablement dix appels successifs à doRun.run ().

1
gerardw