Comment l'événement répartit-il le fil de discussion?

Avec l'aide de personnes sur stackoverflow j'ai été en mesure d'obtenir les éléments suivants code de travail d'une interface simple compte à rebours (qui affiche simplement une fenêtre de comptage en secondes). Mon principal problème avec ce code, il est invokeLater choses.

Autant je comprends invokeLateril envoie une tâche à l'événement expédition fil (HAE), et puis l'EDT exécute cette tâche chaque fois qu'il "peut" (quoi que cela signifie). Est ce que le droit?

À ma connaissance, le code fonctionne comme ceci:

  1. Dans le main méthode que nous utilisons invokeLater pour afficher la fenêtre (showGUI méthode). En d'autres termes, le code de l'affichage de la fenêtre seront exécutés dans l'EDT.
  2. Dans le main méthode, nous avons également démarrer le counter et le compteur (par construction) est exécutée dans un autre thread (donc il n'est pas dans le cas de dispatching thread). Droit?
  3. La counter est exécutée dans un thread séparé et régulièrement, il appelle updateGUI. updateGUI est censé mettre à jour l'interface graphique. Et le GUI est de travailler dans l'EDT. Donc, updateGUI devrait également être exécutée dans l'EDT. C'est la raison pour laquelle le code de la updateGUI est enfermé dans invokeLater. Est ce que le droit?

Ce n'est pas clair pour moi, c'est pourquoi nous l'appelons le counter de l'EDT. De toute façon, il n'est pas exécuté dans l'EDT. Il commence immédiatement, un nouveau thread et le counter est exécutée. Donc, pourquoi ne pouvons-nous pas appel à la counter dans la méthode main après la invokeLater bloc?

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class CountdownNew {

    static JLabel label;

    //Method which defines the appearance of the window.   
    public static void showGUI() {
        JFrame frame = new JFrame("Simple Countdown");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        label = new JLabel("Some Text");
        frame.add(label);
        frame.pack();
        frame.setVisible(true);
    }

    //Define a new thread in which the countdown is counting down.
    public static Thread counter = new Thread() {
        public void run() {
            for (int i=10; i>0; i=i-1) {
                updateGUI(i,label);
                try {Thread.sleep(1000);} catch(InterruptedException e) {};
            }
        }
    };

    //A method which updates GUI (sets a new value of JLabel).
    private static void updateGUI(final int i, final JLabel label) {
        SwingUtilities.invokeLater( 
            new Runnable() {
                public void run() {
                    label.setText("You have " + i + " seconds.");
                }
            }
        );
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                showGUI();
                counter.start();
            }
        });
    }

}

source d'informationauteur Roman