2009-01-29 8 views
30

Integruję mój wygląd z aplikacją i napotykam na kilka problemów związanych z wewnętrznymi procedurami sprawdzania EDT (Event Dispatch Thread). Substancja absolutnie odmawia konstruowania klas UI poza EDT. Zrobiłem dużo Swing/AWT i znam większość zasad dotyczących EDT. Używam SwingWorker, SwingUtilties.invokeLater do modyfikowania komponentów. Zawsze jednak, że elementy mogą być ZBUDOWANE poza EDT, ale musi być realizowany i manipulowane na EDT. Innymi słowy, możesz budować i konfigurować domyślne ustawienia w tle, ale wywołanie funkcji pack/setVisible musi mieć wartość EDT, jak również wszelkie kolejne wywołania do manipulowania komponentem.Czy można bezpiecznie tworzyć widgety Swing/AWT, a nie wątek wysyłania zdarzeń?

Powodem, dla którego pytam, jest to, że mam szczególnie "rozbudowane" okno do tworzenia, obejmujące wiele widgetów, stanów i zasobów (wiele ikon). Wcześniej skonstruowałem okno na tle metody SwingWorker i uczyniłem okno widocznym w zrobionej metodzie. Nigdy nie miałem jednego problemu. Po przejściu na Substance, wewnętrzne sprawdzanie EDT mnie ugryza.

Udało mi się zreorganizować kod, aby obejść ten problem. Mogę zbudować na EDT, który nie jest dobrym rozwiązaniem, ponieważ cała aplikacja będzie blokować. Mogę również zreorganizować jeszcze więcej i postaram się załadować wszystkie dodatkowe zasoby poza EDT.

Owijanie go ... Czy to bezpieczne skonstruować NIE widgety Swing/AWT na temat zdarzeń wysyłki?

Odpowiedz

39

Sun zmienił zasady w 2004 roku - przed, byłaś mogły tworzyć komponenty poza EDT i musiały przejść do EDT dopiero po tym, jak komponent został zrealizowany.

Nowa reguła brzmi teraz:

Aby uniknąć impasu, należy zachować szczególną ostrożność, że Swing komponenty i modele są stworzony, modyfikowane, a pytani tylko od przypadku -dystrybucja wątku.

this wpis na blogu zawiera więcej szczegółów, w tym linki do innych powiązanych artykułów. zauważ, że wszystkie oficjalne Sun examples zostały przepisane i są bardzo surowe.

historycznie prawdopodobnie zwiększająca się dostępność komputerów wielordzeniowych jako komputerów stacjonarnych zmotywowała do ponownego sformułowania reguły - problemy z wątkami stawały się coraz bardziej widoczne na stosie klientów, a także były bardzo rygorystyczne w przypadku EDT. wytycznych, wielu z nich można zapobiec od samego początku.

+1

podstępne podstępne ... dziękuję za konkretne dowody, których pragnąłem. Czas na refaktor! – basszero

+0

To więcej warunków wyścigu niż zakleszczenia, które powodują problem. –

+0

@tom: Zgadzam się co do warunków wyścigu - nigdy nie twierdziłem, że to były zakleszczenia, czy ja (właśnie odnosiłem się do "problemów z gwintowaniem")? – netzwerg