Frage

Ich bin relativ neu in Java und war neugierig, wie ActionListener funktionieren. Sagen Sie, ich habe einen Action -Hörer für einen Timer, der wie folgt implementiert ist:

class TimerActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        //perform some operation
    }
}

Was wird passieren, wenn der Timer so eingestellt ist, dass der Code in meiner ActionListener -Klasse ausgeführt wird. Vervollständigt der Code neue Anfragen, bis er fertig ist (wie ein Interrupt). Oder hat der neue Aufruf zum ActionListener Vorrang vor der aktuellen Instanz - so dass der Code niemals abgeschlossen ist?

War es hilfreich?

Lösung

Das Timing des Timers erfolgt im Thread, der sich vom Ereignis -Versand -Thread (oder EDT) unterscheidet, der Thread, der den Code im ActionListener ausführt. Selbst wenn der actionperformierte Code langsam ist, feuert der Timer trotzdem weiter und stellt seinen actionperformierten Code in der Ereigniswarteschlange vor, die wahrscheinlich gesichert werden und der Ereignis -Thread verstopft wird und die Anwendung nicht mehr reagiert oder schlecht reagiert.

Ein Take-Home-Punkt besteht darin, zu vermeiden, dass ein Code angerufen wird, der im Ereignis-Thread etwas Zeit in Anspruch nimmt, da die GUI nicht mehr reagiert. Erwägen Sie, einen Swingworker für Fälle wie diese zu verwenden.

Bearbeiten: Bitte beachten Sie den Kommentar von Trashgod unten für den Sieg!

Andere Tipps

Basierend auf den Beiträgen von Hovercraft und Trashgod scheint es, dass die Timer -Ereignisse nicht nach ihrer Standardeinstellung anstehen. (IE neue Timer -Events werden ignoriert, bis der Timer -Event -Handler -Code ausgeführt wurde.)

Sie können es selbst testen und etwas wie folgt implementieren:

class TimerActionListener implements ActionListener {
    public static int inst = 1;
    public void actionPerformed(ActionEvent e) {
        int id = inst++;
        System.out.println("Executing instance: " + id);
        try { Thread.sleep(3000); } catch (Exception e) {} //For sleep 3 seconds
        System.out.println("Instance: " + id + "done! ");
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top