68 votes

Java Événement de distribution du Fil explication

J'ai récemment commencé à apprendre et à explorer les bases de la programmation GUI en Java.

Avoir été de programmation pour un moment, j'ai seulement fait backend travail ou un travail et comme un résultat le plus proche que j'ai pris pour des interfaces utilisateur est la console de commande (gênant, je le sais).

Je suis l'aide de Swing et aussi loin que je peux rassembler ce qui signifie, par extension, je suis également à l'aide de AWT.

Ma question est basée sur ce morceau de code:

java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        new frame.setVisible(true);
    }
} );

J'ai fait des recherches sur ce pendant un certain temps que je voulais bien comprendre cet étrange morceau de code et en sont venus à travers l'expression "Événement de distribution du Fil" à plusieurs reprises. Corrigez-moi si je me trompe, mais ce que je comprends; il a à faire avec l'utilisation de plusieurs threads et comment Java Swing interprète ces threads. Je rassemble ainsi que le code ci-dessus est utilisé pour s'assurer que tous les fils sont "en sécurité" avant qu'il ne crée la fenêtre, d'où le invokeLater?

J'ai lu que:

"Vous ne pouvez appeler les méthodes qui fonctionnent sur le cadre de l'Événement de distribution du Fil"

et uniquement sous certaines circonstances, vous pouvez appeler les méthodes qui fonctionnent sur le cadre de la méthode main.

Quelqu'un peut-il préciser pour moi ce qu'est exactement le Cas de distribution du Thread? Comment il se rapporte à plusieurs threads d'exécution et comment ces fils ne sont pas sûrs d'être appelé à partir de la méthode main? Aussi pourquoi avons-nous besoin de cette invokeLater? Ne pouvons-nous pas simplement créer la fenêtre comme n'importe quel autre objet?

J'ai touché un peu à un bloc de route dans ma recherche car je ne suis pas saisir ces relations et des idées.

Une note de côté, c'est que j'aime à la base de mes connaissances sur la compréhension en profondeur comme je le crois, ce qui conduit au meilleur résultat global et par conséquent, le meilleur des programmes. Si je comprendre en profondeur le fonctionnement de quelque chose, alors vous pouvez utiliser les trucs et astuces efficacement plutôt que de simplement parroting en arrière dans le code, donc merci de ne pas avoir peur de me donner une certaine supplémentaire de la profondeur des explications et élargir mes connaissances.

Je vous remercie.

78voto

luke Points 6688

Le EventDispatching fil est un fil spécial qui est géré par l'AWT. Fondamentalement, c'est un thread qui s'exécute dans une boucle infinie de traitement de l'événement. La java.awt.EventQueue.invokeLater méthode est une façon particulière de fournir un code qui sera exécuté sur la file d'attente des événements. L'écriture d'un framework d'interface qui est sûre dans un environnement multithreading est très difficile de l'AWT auteurs ont décidé qu'ils allaient autoriser uniquement les opérations sur les objets graphiques à se produire sur un seul fil spécial. Tous les gestionnaires d'événements s'exécuter sur ce fil et l'ensemble du code qui modifie l'interface graphique devrait également fonctionner sur ce fil.

Maintenant, l'AWT n'a pas l'habitude de vérifier que vous n'êtes pas les problèmes de gui de commandes à partir d'un autre thread (Le framework WPF C# ne le faire). il est donc possible d'écrire beaucoup de code et d'être à peu près à agnostiques et de ne pas courir dans tous les problèmes. Mais cela peut conduire à un comportement indéfini de sorte que la meilleure chose à faire est de toujours s'assurer que le code de la gui s'exécute sur l'event dispatcher fil. invokeLater fournit un mécanisme pour ce faire.

Donc, un exemple classique est que vous avez besoin pour exécuter une opération longue à exécuter, comme le téléchargement d'un fichier. Si vous lancer un thread pour effectuer cette action, puis lorsqu'il est terminé, vous allez utiliser invokeLater de mettre à jour l'INTERFACE utilisateur. Si vous n'utilisez pas invokeLater et au lieu de cela, vous venez de mettre à jour l'interface utilisateur directement, vous pourriez avoir une condition de concurrence et de comportement indéfini pourrait se produire.

Wikipedia a plus d'informations: http://en.wikipedia.org/wiki/Event_dispatching_thread

Aussi, si vous êtes curieux de savoir pourquoi l'awt auteurs de ne pas juste faire de la trousse à outils multithread voici un bon article: http://weblogs.java.net/blog/kgh/archive/2004/10/multithreaded_t.html

14voto

mKorbel Points 90340

EventDispatchThread (HAE) est un fil spécial réservé uniquement pour le Swing du GUI et de la *Swing liés à des événements par exemple, créer/modifier/mise à jour le Swing JComponents, plus de questions posées ici et ici

toutes les sorties de l'interface utilisateur graphique de BackGround Tasks, Runnable#Thread doit être enveloppé dans invokeLater(), à partir des Objets synchronisés en invokeAndWait();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X