2011-03-31 5 views
2

unlike SwingUtilities.invokeAndWait(), the event thread is permitted to call SwingUtilities.invokeLater(). Je ne peux pas comprendre cela clairement.que signifie cette déclaration

S'il vous plaît aidez-moi dans ceci.

+1

Vous êtes pardonné car techniquement c'est une mauvaise grammaire. Il devrait être: "contrairement à SwingUtilities.invokeAndWait(), SwingUtilities.invokeLater() peut être appelé par le thread d'événement." – DJClayworth

Répondre

7

Un autre thread (pas le thread principal de l'événement Swing) peut appeler invokeAndWait pour attendre que le thread d'événement Swing soit prêt à exécuter une action. Toutefois, le thread d'événement Swing ne peut pas attendre lui-même. Il appelle donc invokeLater pour placer l'action dans une file d'attente pour une exécution ultérieure.

3

N'étant pas un développeur Java, je pense que si invokAndWait est exécuté sur un thread d'événement, il se bloquera lui-même.

méthode
+1

Même si ce n'est pas une mauvaise idée, -1 pour décourager les devinettes en général. – Pops

2

Source

Le invokeAndWait() ressemble, mais il a trois différences sémantiques importantes. Tout d'abord, la méthode invokeLater() s'exécute de manière asynchrone à un moment donné dans le futur. Vous ne savez pas quand il va réellement fonctionner. D'un autre côté, la méthode invokeAndWait() est synchrone: elle ne retourne pas tant que sa cible n'a pas terminé son exécution. En règle générale, vous devez utiliser la méthode invokeAndWait() pour lire la valeur des composants Swing ou pour vous assurer que quelque chose est affiché à l'écran avant de poursuivre l'exécution du programme. Sinon, vous pouvez utiliser la méthode invokeLater().

La deuxième différence est que la méthode invokeAndWait() ne peut pas être appelée depuis le thread répartiteur d'événements. Le thread exécutant la méthode invokeAndWait() doit attendre que le thread répartiteur d'événements exécute du code. Aucun thread, y compris le thread d'envoi d'événements, ne peut attendre autre chose. Par conséquent, si vous exécutez la méthode invokeAndWait() à partir du thread répartiteur d'événements, il lance java.lang.Error. Cela provoque la sortie du thread d'envoi d'événement (sauf si vous avez pris l'étape inhabituelle d'attraper des objets Erreur dans votre code); à son tour, votre programme entier devient désactivé. La troisième différence est que la méthode invokeAndWait() peut lancer une exception InterruptedException si le thread est interrompu avant que le thread répartissant les événements n'exécute la cible ou InvocationTargetException si l'objet Runnable génère une exception ou une erreur d'exécution.

-IvarD