Pourquoi utiliser SwingUtilities.invokeLater dans la méthode principale?
Après des années de programmation Java, j'ai toujours utilisé pour créer mon main()
des méthodes comme celle-ci:
public static void main(String[] args)
{
runProgram();
}
mais récemment j'ai étudié quelques codes du Web et j'ai vu cela parfois au lieu de l'habituel main()
Utiliser ci-dessus:
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
runProgram();
}
});
}
je veux simplement savoir :
- Pourquoi utiliser cette au lieu de l'habituel
main()
? Je ne vois aucune différence quand je lui donner un essai. - Quelle est la différence entre ces deux façons ?
merci de m'avoir lu et de vos réponses.
3 réponses
les docs expliquent pourquoi. À partir de Threads Initiaux
pourquoi le fil initial ne crée-t-il pas simplement L'interface graphique elle-même? Parce que presque tout le code qui crée ou interagit avec les composants Swing doit fonctionner sur le thread event dispatch.
certaines méthodes de composants Swing sont étiquetées "thread safe" dans la spécification de L'API; elles peuvent être invoquées en toute sécurité à partir de n'importe quel fil. toutes les autres méthodes des composants Swing doivent être invoquées à partir du thread event dispatch. Les programmes qui ignorent cette règle peut fonctionner correctement la plupart du temps, mais sont sujettes à des erreurs imprévisibles qui sont difficiles à reproduire.
parce que le thread "main" lancé par VM n'est pas le event dispatch thread.
quelques composants Swing de L'API ne sont pas thread safe,ce qui signifie qu'ils peuvent causer des problèmes comme deadlock,il est donc préférable de créer et de mettre à jour ces composants swing en utilisant Event dispatcher thread fourni par Swing mais pas à partir du thread principal ou tout autre thread créé à partir de main.