Ist es sicher, Schaukel / AWT-Widgets nicht auf dem Event Dispatch Thread zu konstruieren?
-
20-08-2019 - |
Frage
Ich habe die Substanz wurde die Integration in meine Anwendung aussehen und sich anfühlen und lief in einige Probleme in Bezug auf es ist interne EDT (Event Dispatch Thread) Prüfroutinen. Substanz absolut weigert UI-Klassen außerhalb des EDT zu konstruieren. Ich habe vielen Swing / AWT getan, und ich weiß, die meisten von den Regeln des EDT in Bezug auf. Ich benutze Swingworker, SwingUtilties.invokeLater zu Komponenten zu ändern. Ich habe immer aber, dass Komponenten könnte sein, GEBAUT außerhalb des EDT, sondern muss realisiert und < em> manipuliert am EDT. Mit anderen Worten, können Sie konstruieren und Setup Defaults im Hintergrund, aber der Anruf zu packen / setVisible muss EDT sowie alle nachfolgenden Anrufe, die Komponente zu manipulieren.
Der Grund, warum ich frage ist, dass ich ein besonders „bulligen“ Fenster habe zu konstruieren, viele Widgets, Staat und Ressourcen (viele Icons) beteiligt ist. Zuvor baute ich das Fenster auf dem Hintergrund Verfahren eines Swingworker und machte das Fenster sichtbar in der getan Methode. Sie hatte nie ein einziges Problem. Bei zu Substance Umschalten beißt die interne EDT Überprüfung mich.
Ich habe in der Lage Code Refactoring, dies zu umgehen. Ich kann auf dem EDT konstruieren, die keine gute Lösung, da die gesamte Anwendung ist blockiert. Ich kann auch noch mehr Refactoring und versuche mein Bestes, alle zusätzlichen Ressourcen außerhalb des EDT zu laden.
Verpackung so ... Ist es sicher zu konstruieren Schwingen / AWT-Widgets nicht auf dem Event Dispatch Thread?
Lösung
So hat die Regeln im Jahr 2004 geändert -. Vor, Sie waren erlaubt, die Komponenten außerhalb des EDT zu schaffen und hatte nur in den EDT zu bewegen, sobald die Komponente war klar
Die neue Regel lautet nun:
Um die Möglichkeit einer Deadlock zu vermeiden, Sie müssen extrem aufpassen, dass Schwingen Komponenten und Modelle sind erstellt , geändert, und nur von der abgefragte Event-Dispatching Thread.
dieser Blogeintrag von mir gibt mehr Informationen, einschließlich Links zu anderen verwandten Artikeln. beachten Sie, dass alle rel="noreferrer"> Beispiele offiziellen Sun neu geschrieben wurde, und ist sehr streng darüber.
historisch, ist es wahrscheinlich war die zunehmende Verfügbarkeit von Multi-Core-Computer als Desktop-Maschinen, die die Neuformulierung der Regel motivierten - Threadingprobleme wurde immer deutlicher auf dem Client-Stack, und durch auf EDT Richtlinien sehr streng zu sein viele von ihnen können von vornherein verhindert werden.
Andere Tipps
Nein.
Einfacher Grund ist, dass selbst die EDT in einigen seltenen Fällen Deadlock mögen und im Allgemeinen ist es einfach, die Benutzeroberfläche in einer Sackgasse, wenn Schwingen mit ( oder so habe mir gesagt, ). Ich schlage vor, Sie diese drei Artikel von Kirill lesen (die Substanz dev) Blog: