Expliquer ce que le code suivant ne?
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
S'il vous plaît dites-moi ce que fait le code ci-dessus n'est en réalité. Je suis à la recherche d', ligne par ligne, explication. en particulier, la première ligne et dites-moi pourquoi nous les utilisons et dans quelles circonstances nous avons pour l'utiliser.
OriginalL'auteur Deepak | 2011-02-05
Vous devez vous connecter pour publier un commentaire.
Dans cet Exemple, vous voyez un anyonmous classe qui dérive de Praticable. Cette classe anonyme remplace la méthode run de l'interface runnable. Alors cette classe anonyme est instancié et transmis à la EventQueue.invokeLater méthode, qui est une méthode statique. Cette méthode ajoute l'objet dans...... la eventQueue. Dans le EvenQueue de nombreux événements, comme les événements de clavier ou de la souris d'événements ou de quoi que ce soit. Il y a un Thread qui continuesly sondages données de cette file d'attente. Une fois que le Thread atteint la classe anonyme qui a été instancié ici, il va exécuter la méthode run (), qui va instancier un Objet de la classe NewJFrame et le configurer pour qu'il soit visible.
Le point de le faire compliqué, c'est que le new JFrame().setVisible(true) n'est pas exécutée dans le thread principal, mais dans le cas de dispatching fil. En Swing, vous devez exécuter l'ensemble du code qui modifie l'interface utilisateur en cas de dispatching fil.
Et qu'arriverait-il si vous venez de mettre cela dans la méthode main, sans emballage?
public static void main(String args[]) {New JFrame().setVisible(true);}
Ensuite, vous briser la règle du code qui affecte l'INTERFACE utilisateur doit être exécutée dans le cas de dispatching fil. Cela peut se produire au travail (la plupart du temps), mais pourrait également provoquer un certain nombre d'erreurs liées à des conditions de course etc. Il est difficile de prédire ce qui pourrait arriver. Peut-être que vous exécutez dans les erreurs de dessin, peut-être pas.
Donc si j'ai bien compris, c'est un codage lignes directrices, les meilleures pratiques, mais pas une règle stricte? J'ai tous les cas, merci pour la réponse!
Pas de. C'est une règle. Si vous le cassez, vous risquez aléatoire difficiles à déboguer des problèmes. Ce n'est pas comme une meilleure pratique, comme "ne pas écrire tout le code sur une seule ligne". Créer illisible code, mais en théorie, les œuvres. N'adhérant pas à la règle peut briser votre application.
OriginalL'auteur yankee
Single-Thread-Modèle et EDT
Plus moderne, l'INTERFACE utilisateur des bibliothèques adopter la
single-thread-model
. Cela signifie que, toutes les manipulations sur les composants de l'INTERFACE utilisateur DOIT être fait sur le même thread unique. Pourquoi? C'est parce que permettant à des composants de l'INTERFACE utilisateur en cours de mise à jour à partir de plusieurs threads conduira au chaos depuis la plupart Swing méthodes de l'objet ne sont pas "thread-safe". Pour des raisons de simplicité, efficacité et robustesse, le seul thread-modèle est adopté.Dans le Swing, la très thread qui servent le
single-thread-model
est appelé le Événement Expédition Fil, c'est à dire HAE. Il n'est pas fourni par le Swing. Il est fourni par Abstract Window Toolkit, c'est à dire AWT.Thread de travail vs thread d'INTERFACE utilisateur
Un non-trivial application GUI a de nombreux fils. En application de l'interface utilisateur moderne, il peut y avoir plusieurs threads de travail pour faire le sale boulot, mais il y a un seul thread d'INTERFACE utilisateur (Swing appelle HAE) pour mettre à jour l'interface graphique. Les threads de travail ont souvent besoin de réfléchir à leur avancement des travaux dans le GUI, donc ils ont besoin de communiquer avec le thread d'INTERFACE utilisateur à ce sujet. Alors, comment cette communication se produire?
java.awt.EventQueue
La communication se fait par le biais d'un message de la file d'attente modèle. Le
java.awt.EventQueue
est la classe qui fournit une file d'attente d'événements à l'échelle mondiale. Cet événement mondial de la file d'attente sert de canal de communication et à l'EDT. EDT choisit les messages de ce EventQueue et mettre à jour les composants de l'INTERFACE utilisateur en conséquence. Si une autre partie de votre programme veut manipuler l'INTERFACE utilisateur, la partie de code doit appelerEventQueue.invokeLater()
ouEventQueue.invokeAndWait()
de mettre un message dans EventQueue. EDT traitera tous les messages en attente dans le EventQueue et, éventuellement, obtenir le message.le thread principal
Votre extrait de code se trouve généralement dans le
main()
fil, lemain
fil peut être considéré comme une sorte deworker thread
ici. Seulement qu'au lieu de la mise à jour de l'interface graphique par l'envoi de messages à EventQueue, il lance l'interface graphique. De toute façon, l'initiation peut être considéré comme une sorte de travail, trop.Après que l'interface graphique est lancé, le thread principal va se ferme et l'EDT permettra d'éviter le processus de sortie.
Et une autre bonne explication:
Java Événement de distribution du Fil explication
Un article intéressant:
Multi-thread trousse à outils, de l'échec d'un rêve?
Merci pour le tuyau. Lien mis à jour.
OriginalL'auteur smwikipedia
C'est un bloc de code qui est chargé d'exécuter à une date ultérieure (parfois appelé un différé). L'intérieur de la classe (
new Runnable() {...}
) est essentiellement vous permettant de passer d'un bloc de code qui va être exécuté. LeinvokeLater
méthode garantit que le bloc de code sera exécuté, mais ne garantit pas de quand. Parfois, il n'est pas sûr d'avoir certaines de code à exécuter immédiatement, et sa trop verbeux pour faire du multi-threading vous-même. Donc Java fournit cette méthode utilitaire pour exécuter en toute sécurité le code. Le code sera exécuté très prochainement, mais pas jusqu'à ce qu'il est sécuritaire de le faire.OriginalL'auteur kelloti
La
invokeLater
appel mettre l'exécutable spécifié sur une file d'attente pour être traitées plus tard. Qui est, le code à l'intérieur de larun()
méthode n'aura pas été exécuté, cependant, quand lesinvokeLater
appel de la méthode retourne.Il y a habituellement deux types de cas d'utilisation pour ce type de code.
Une classe anonyme est passé comme paramètre à la
invokeLater
appel. C'est le même que le présent code.et je suppose (nouveau JFrameCreator()) va créer une classe anonyme. Est-ce à dire que quand ce fil est traité le run() est exécuté automatiquement. Je suis désolé si je demande quelque chose de complètement faux.. je veux juste savoir sur run() et (nouveaux JFrameCreator())..
Non, désolé, mais cela ne fonctionnera pas. La classe JFrameCreator DOIT mettre en œuvre des Exécutables (il suffit d'écrire la classe JFrameCreator implements Runnable). Et @Deepak: Non, il n'y a pas de classe anonyme impliqués dans cet exemple.
seulement si la classe JFrameCreator est mis en œuvre comme praticable la méthode run() est invoquée rite ? ou que si nous donnons un constructeur pour JFrameCreator et à l'intérieur, le constructeur nous appelons setVisible(true) ?? ce travail ?
Et bien oui il ne va pas appeler la méthode run (). Parce que ce code ne sera même pas compiler. Le invokeLater() la méthode s'attend à obtenir un Objet qui implémente Runnable. C'est juste dans la liste des arguments de la méthode. Si vous essayez de passer à autre chose, alors il ne compile pas. De cette façon, le invokeLater méthode permet de s'assurer que chaque objet il obtient A une méthode appelée exécuter. / Le constructeur de la partie. Non, toujours pas compiler. Et même si ça serait: Le compilateur est exécutée dans le thread courant. Donc oui, le code dans le constructeur serait exécuté, mais dans le thread principal
OriginalL'auteur vidstige
Source
La invokeLater() méthode prend un Exécutable objet comme paramètre. Il envoie l'objet de l'événement de distribution du thread qui exécute la méthode run (). C'est pourquoi il est toujours plus sûr de la méthode run() pour exécuter du code Swing.
-IvarD
OriginalL'auteur topgun_ivard