2009-01-29 8 views
30

Ich habe die Substance Look and Feel in meine Anwendung integriert und stieß auf mehrere Probleme in Bezug auf seine interne EDT (Event Dispatch Thread) Prüfroutinen. Die Substanz weigert sich absolut, UI-Klassen außerhalb des EDT zu konstruieren. Ich habe viel Swing/AWT gemacht und kenne die meisten Regeln bezüglich des EDT. Ich verwende SwingWorker, SwingUtilties.invokeLater, um Komponenten zu modifizieren. Ich dachte immer, dass die Komponenten könnte außerhalb des EDT GEBAUT, muss aber sein realisiert und manipuliert am EDT. Mit anderen Worten, Sie können Standardwerte im Hintergrund erstellen und einrichten, aber der Aufruf von pack/setVisible muss sowohl EDT als auch alle nachfolgenden Aufrufe sein, um die Komponente zu bearbeiten.Ist es sicher, Swing/AWT-Widgets NICHT im Event-Dispatch-Thread zu erstellen?

Der Grund, warum ich frage, ist, dass ich ein besonders "bulliges" Fenster zu konstruieren habe, das viele Widgets, Zustand und Ressourcen (viele Symbole) enthält. Zuvor habe ich das Fenster mit der Hintergrundmethode eines SwingWorker erstellt und das Fenster in der done-Methode sichtbar gemacht. Hatte nie ein einziges Problem. Nach dem Wechsel zu Substance, beißt die interne EDT-Prüfung mich.

Ich konnte Code umgestalten, um dies zu umgehen. Ich kann auf dem EDT aufbauen, was keine gute Lösung ist, da die gesamte Anwendung blockiert wird. Ich kann sogar noch mehr umgestalten und versuche mein Bestes, um alle zusätzlichen Ressourcen außerhalb des EDT zu laden.

Wrapping so ... Ist es sicher zu Schwingen/AWT-Widgets nicht auf dem Thema Event Dispatch konstruieren?

Antwort

39

Sun die Regeln im Jahr 2004 verändert hat - vor, Sie waren erlaubt, die Komponenten außerhalb des EDT zu erstellen und musste erst in den EDT einsteigen, nachdem die Komponente realisiert wurde.

Die neue Regel lautet nun:

die Möglichkeit einer Deadlock zu vermeiden, Sie äußerste Sorgfalt zu achten, dass Komponenten und Modelle Schwingen sind erstellt, modifiziert und abgefragt nur vom Ereignis -Threading-Thread.

this Blogpost von mir gibt weitere Details, einschließlich Links zu anderen verwandten Artikeln. Beachten Sie, dass alle offiziellen Sun examples wurden neu geschrieben und sind sehr streng darüber.

war es wahrscheinlich die zunehmende Verfügbarkeit von Multicore-Computern als Desktop-Maschinen, die die Neuformulierung der Regel motivierten - Threading-Probleme wurden auf dem Client-Stack immer mehr sichtbar und EDT sehr streng Richtlinien können viele von Anfang an verhindert werden.

+1

hinterhältig hinterhältig ... danke für die konkreten Beweise, die ich begehrte. Zeit zum Refactor! – basszero

+0

Es sind mehr Rennbedingungen als Deadlocks, die das Problem verursachen. –

+0

@tom: ich stimme den Bedingungen des Rennens zu - habe nie behauptet, dass es die Deadlocks sind, habe ich (nur "Threading Probleme" genannt)? – netzwerg

Verwandte Themen