Nach Einführung des Java-Speichermodells wurden die Swing-Richtlinien dahingehend geändert, dass alle Swing-Komponenten auf dem EDT instanziiert werden müssen, um einen nicht veröffentlichten Instanzstatus zu vermeiden.Kann man Swing-Klassen in Nicht-EDT-Threads laden?
Was ich nirgendwo finden konnte, ist, ob das Classloading auch auf dem EDT stehen soll oder können wir Key Swing-Klassen in einem Hintergrundthread vorladen? Gibt es dazu eine offizielle Stellungnahme von Sun/Oracle? Gibt es Klassen, von denen bekannt ist, dass sie einen nicht-threadsicheren statischen Zustand besitzen und daher auf EDT geladen werden müssen?
Klärung zu Nemis Frage zu beantworten: Dies ist ein praktisches Problem. Ein beträchtlicher Teil der Startzeit unserer Anwendung ist das Laden von Klassen und das Laden von Schriften/Bildern auf dem EDT. Das meiste davon kann Swing und verwandten Bibliotheken zugeschrieben werden.
Hier ist Som Hintergrund: Wie viele andere Swing-Anwendungen, sind wir beim Start vorkonfigurieren viele Formulare, um die Benutzeroberfläche reaktionsfähiger zu machen. Nach dem Profiling stellten wir fest, dass die tatsächliche Zeit für die Formularkonstruktion relativ schnell ist - was langsam ist, ist das Laden aller Klassen und Schriftarten (Festplattenlesevorgänge sind langsam im Firmen-Setup mit On-Access-Virenscanner, Überwachungsscanner, Überwachungs-Tracker und Gott weiß) was noch auf dem HDD-Treiber angeheftet wurde).
Wir haben versucht, die gleichen Formen in einem Hintergrund-Thread zu konstruieren (Swing-Regeln verletzen) und dann wegwerfen. Sobald wir fertig sind, konstruieren wir dieselben Formulare auf dem EDT, was viel schneller ist, wenn alle Klassen geladen sind und alle anderen Dateien im Plattencache sind. Es funktioniert für uns, und wir werden wahrscheinlich weitermachen, wenn nicht wirklich etwas Schlimmes passiert.
Was ich frage ist, ob dies eine sichere Praxis, eine gute Praxis oder ein Hack ist?
Insbesondere die beiden Singleton-Klassen I waren UIManager und AppContext denken können. Beide Javadocs geben nicht an, ob sie threadsicher sein sollen. AppContext sieht ordnungsgemäß synchronisiert aus, außer dass die isDisposed() -Methode den Status nicht richtig liest (Synchronisation erforderlich). UIManager ist kostenlos für alle, aber sobald der EDT startet, glaube ich nicht, dass ein anderer Thread es mutieren würde. – ddimitrov
Dies ist eine interessante Frage. Ist es rein akademisch oder gibt es ein echtes Problem, das du lösen willst? Ich kann mir keinen guten Grund vorstellen, warum du das tun würdest. – Nemi
@Nemi, fügte der Frage mehr Kontext hinzu – ddimitrov