Yongkang  Shuangyu  Przemysł  i  Handel  Co.,  Sp. z o.o

Jak uniknąć zakleszczenia w aplikacji huśtawki?

Jun 06, 2025

Zaklebienia mogą stanowić znaczący problem w aplikacjach huśtawki, często prowadząc do niereagujących interfejsów użytkownika i słabej wrażenia użytkownika. Jako dostawca huśtawki napotkałem te problemy z pierwszej ręki i opracowałem strategie, aby ich uniknąć. W tym poście na blogu podzielę się jednymi z najlepszych praktyk zapobiegania impasom w aplikacjach huśtawki.

Zrozumienie impasów w zamachu

Zanim zagłębiamy się w rozwiązania, ważne jest, aby zrozumieć, czym są impas i jak występują w aplikacjach huśtawki. Zaklebienie ma miejsce, gdy dwa lub więcej wątków jest zablokowane na zawsze, każdy czeka, aż drugi zwolni zasób. W huśtawce impas mogą wystąpić, gdy wątek wysyłki zdarzenia (EDT) i inne wątki konkurują o te same zasoby, takie jak zamki lub komponenty GUI.

EDT jest odpowiedzialny za obsługę wszystkich zdarzeń związanych z GUI, w tym malarstwo, układ i dane wejściowe użytkownika. Jeśli EDT zostanie zablokowany, całe GUI staje się niereagujące. Może się to zdarzyć, jeśli inny wątek utrzymuje zamek, którego potrzebuje EDT, lub jeśli EDT trzyma blokadę, której potrzebuje inny wątek.

Najlepsze praktyki unikania impasów

1. Użyj poprawnie wątku wysyłki zdarzenia

EDT powinien być używany tylko do zadań związanych z GUI. Wszystkie inne długotrwałe zadania, takie jak żądania sieciowe lub zapytania bazy danych, powinny być wykonywane w osobnych wątkach. Zapewnia to, że EDT pozostaje responsywny i może w odpowiednim czasie obsługiwać dane wejściowe użytkownika.

import javax.swing.*; Public Class SwingExample {public static void main (String [] args) {// Zaplanuj zadanie dla wątku wysyłki zdarzenia: // tworzenie i wyświetlanie GUI tej aplikacji. Swingutilities.invokelater (() -> {// Utwórz i skonfiguruj okno. Jframe frame = new Jframe („huśtawka przykładowa”); frame.setDefaultCloseoperation (jframe.exit_on_close); // Dodaj etykietę do okna. Jlabel label = new Jlabel ("hello, świat! frame.pack (); }}

W tym przykładzieSwingUtilities.invokelaterMetoda służy do zaplanowania tworzenia i wyświetlania GUI na EDT. Zapewnia to tworzenie i aktualizowane GUI w sposób bezpieczny wątków.

2. Unikaj trzymania zamków przez długi czas

Jeśli chcesz używać zamków w aplikacji huśtawki, upewnij się, że trzymaj je tak krótko, jak to możliwe. Od dawna zamki mogą zwiększyć prawdopodobieństwo impasów, zwłaszcza jeśli wiele wątków konkuruje o te same zasoby.

import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; klasa publiczna lockexample {private final lock lock = new reentrantlock (); public void dosomething () {lock.lock (); Spróbuj {// wykonaj krótkie zadanie, trzymając zamek. System.out.println („robienie czegoś ...”); } wreszcie {lock.unlock (); }}}

W tym przykładziezamekodbywa się tylko przez czas krótkiego zadania. Po zakończeniu zadania,zamekjest zwolniony natychmiast.

3. Użyj spójnej kolejności blokowania

Jeśli chcesz uzyskać wiele zamków w aplikacji Swing, upewnij się, że zrobisz to w spójnej kolejności. Pomaga to zapobiec okrągłym warunkom oczekiwania, które są powszechną przyczyną impasów.

import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; Klasa publiczna ConspectentLockeFexample {private final Lock Lock1 = new ReentrantLock (); Private Final Lock Lock2 = new ReentrantLock (); Public void Method1 () {lock1.lock (); spróbuj {lock2.lock (); Spróbuj {// wykonaj zadanie, trzymając oba zamki. System.out.println („Metoda 1 robi coś ...”); } wreszcie {lock2.unlock (); }} wreszcie {lock1.unlock (); }} public void Method2 () {lock1.lock (); spróbuj {lock2.lock (); Spróbuj {// wykonaj zadanie, trzymając oba zamki. System.out.println („Metoda 2 robi coś ...”); } wreszcie {lock2.unlock (); }} wreszcie {lock1.unlock (); }}}

W tym przykładzie obaMetoda1IMetoda2nabyć zamki w tej samej kolejności (pierwszyLock1, NastępnieLock2). Zapewnia to, że nie może wystąpić okrągły warunek oczekiwania.

4. Użyj programowania asynchronicznego

Programowanie asynchroniczne może być potężnym narzędziem do unikania zakleszczań w aplikacjach huśtawki. Korzystając z technik takich jak wywołanie zwrotne, futures lub programowanie reaktywne, możesz wykonywać długotrwałe zadania bez blokowania EDT.

Big Colorful Adult Swing

import javax.swing.*; import java.util.concurrent.executorService; import java.util.concurrent.executors; Klasa public asyxample {private final ExecutorService Executor = Executors.newsingLetHReadExecutor (); public void performlongtask () {executor.submit (() -> {// Wykonaj długo działający zadanie. spróbuj {thread.sleep (5000);} catch (przerywanie e) {E.printStackTrace ();} // zaktualizuj GUI na edt. swingutility.invokelater (() -> {joptionPane.ShowmeSedialog (NULLUS „Długie zadanie!”); }}

W tym przykładzie zadanie długotrwałe jest wykonywane w osobnym wątku za pomocąExecutorService. Po zakończeniu zadania GUI jest aktualizowany na EDT za pomocąSwingUtilities.invokelater.

Zalecane produkty huśtawkowe

Jako dostawca huśtawki oferuję szereg wysokiej jakości produktów huśtawkowych odpowiednich dla dorosłych. Sprawdź naszeDuże dorośli Sensory SwingWDuża kolorowa huśtawka dla dorosłych, ISolidna huśtawka na podwórku. Te huśtawki zostały zaprojektowane tak, aby zapewnić wygodne i przyjemne wrażenia użytkownikom w każdym wieku.

Wniosek

Zaklebienia mogą być frustrującym problemem w aplikacjach huśtawki, ale postępując zgodnie z tymi najlepszymi praktykami, możesz znacznie zmniejszyć prawdopodobieństwo ich spotkania. Pamiętaj, aby prawidłowo używać EDT, unikać trzymania zamków przez długi czas, użyj spójnej kolejności blokowania i rozważ stosowanie technik programowania asynchronicznego. Jeśli masz jakieś pytania lub potrzebujesz dalszej pomocy, skontaktuj się ze mną w celu omówienia potrzeb w zakresie zamówień.

Odniesienia

  • „Effection Java” Joshua Bloch
  • „Współbieżność Java w praktyce” Briana Goetza i in.
  • Samouczki Java:Współbieżność
goTop