Yongkang  Shuangyu  Industrie  și  Comerț  Co.,  Ltd

Cum să evitați blocajele într -o cerere de balansare?

Jun 06, 2025

Deadlocks poate fi o problemă semnificativă în aplicațiile Swing, ceea ce duce adesea la interfețe de utilizator fără răspuns și o experiență de utilizator slabă. În calitate de furnizor de leagăn, am întâmpinat aceste probleme de prima dată și am dezvoltat strategii pentru a le evita. În această postare pe blog, voi împărtăși câteva dintre cele mai bune practici pentru prevenirea blocajelor în aplicațiile swing.

Înțelegerea blocajelor în leagăn

Înainte de a ne scufunda în soluții, este important să înțelegem ce sunt impasurile și cum apar în aplicațiile swing. Un impas se întâmplă atunci când două sau mai multe fire sunt blocate pentru totdeauna, fiecare așteptând ca celălalt să elibereze o resursă. În leagăn, blocajele pot apărea atunci când firul de expediere a evenimentului (EDT) și alte fire concurează pentru aceleași resurse, cum ar fi încuietori sau componente GUI.

EDT este responsabil pentru gestionarea tuturor evenimentelor legate de GUI, inclusiv pictura, aspectul și introducerea utilizatorului. Dacă EDT este blocat, întreaga GUI devine fără răspuns. Acest lucru se poate întâmpla dacă un alt fir deține un blocaj de care are nevoie EDT sau dacă EDT deține un blocaj de care are nevoie un alt fir.

Cele mai bune practici pentru evitarea blocajelor

1. Folosiți corect firul de expediere a evenimentului

EDT trebuie utilizat numai pentru sarcini legate de GUI. Toate celelalte sarcini de lungă durată, cum ar fi solicitări de rețea sau interogări ale bazei de date, ar trebui să fie efectuate pe fire separate. Acest lucru asigură că EDT rămâne receptiv și poate gestiona intrarea utilizatorului în timp util.

import javax.swing.*; public class swingExample {public static void main (String [] args) {// Programează o lucrare pentru firul de expediere a evenimentului: // Crearea și afișarea GUI a acestei aplicații. Swingutitilities.invokelater (() -> {// Creați și configurați fereastra. Jframe Frame = new Jframe ("Exemplu swing"); frame.setDefaultCloseoperation (jframe.exit_on_close); // Adăugați o etichetă la fereastra. JLabel Label = new JLabel ("Hello, World!"); fereastră. }}

În acest exemplu,Swingutitilitii.invokelaterMetoda este utilizată pentru a programa crearea și afișarea GUI pe EDT. Acest lucru asigură că GUI este creat și actualizat într-un mod sigur.

2. Evitați să țineți încuietori mult timp

Dacă aveți nevoie să utilizați încuietori în aplicația dvs. Swing, asigurați -vă că le țineți cât mai scurt timp posibil. Încuietorile de lungă durată pot crește probabilitatea blocajelor, mai ales dacă mai multe fire concurează pentru aceleași resurse.

import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; public class LocKexample {private final Lock Lock = new ReentrantLock (); public void doSomething () {Lock.lock (); Încercați {// efectuați o sarcină scurtă în timp ce țineți blocajul. System.out.println ("a face ceva ..."); } în sfârșit {Lock.unLock (); }}}

În acest exemplu,blocareeste deținut doar pe durata sarcinii scurte. Odată ce sarcina este finalizată,blocareeste eliberat imediat.

3. Folosiți o comandă de blocare constantă

Dacă trebuie să achiziționați mai multe încuietori în aplicația dvs. Swing, asigurați -vă că faceți acest lucru într -o ordine consistentă. Acest lucru ajută la prevenirea condițiilor de așteptare circulară, care sunt o cauză comună a blocajelor.

import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; public class consistentLockingExample {private final Lock Lock1 = new ReentrantLock (); privat final Lock Lock2 = new ReentrantLock (); public void metod1 () {Lock1.lock (); încercați {Lock2.lock (); Încercați {// efectuați o sarcină în timp ce țineți ambele încuietori. System.out.println ("Metoda 1 face ceva ..."); } în sfârșit {Lock2.unlock (); }} în sfârșit {Lock1.unlock (); }} public void metod2 () {Lock1.lock (); încercați {Lock2.lock (); Încercați {// efectuați o sarcină în timp ce țineți ambele încuietori. System.out.println ("Metoda 2 face ceva ..."); } în sfârșit {Lock2.unlock (); }} în sfârșit {Lock1.unlock (); }}}

În acest exemplu, ambeleMetoda1şiMetoda2achiziționați încuietorile în aceeași ordine (mai întâiLock1, atunciLock2) Acest lucru asigură că nu poate apărea o condiție de așteptare circulară.

4. Utilizați programarea asincronă

Programarea asincronă poate fi un instrument puternic pentru evitarea blocajelor în aplicațiile swing. Folosind tehnici precum apeluri de apel, futures sau programare reactivă, puteți efectua sarcini de lungă durată fără a bloca EDT.

Big Colorful Adult Swing

import javax.swing.*; import java.util.concurrent.executorService; import java.util.concurrent.executors; public class asyncexample {private final executorService executor = executori.newsinglethReadExecutor (); public void performLongTask() { executor.submit(() -> { // Perform a long-running task. try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } // Update the GUI on the EDT. SwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog(null, "Long sarcina finalizată! ");});}); }}

În acest exemplu, sarcina de lungă durată este efectuată pe un fir separat folosind unExecutorService. Odată ce sarcina este finalizată, GUI este actualizat pe EDT folosindSwingutitilitii.invokelater.

Produse swing recomandate

În calitate de furnizor de leagăn, ofer o serie de produse swing de înaltă calitate potrivite pentru adulți. Vezi -neAdulți mari cu balansare senzorială,Big colorat pentru adulți colorat, șiSwing solid din curte. Aceste leagăne sunt concepute pentru a oferi o experiență confortabilă și plăcută pentru utilizatorii de toate vârstele.

Concluzie

Deadlocks poate fi o problemă frustrantă în aplicațiile swing, dar urmând aceste bune practici, puteți reduce semnificativ probabilitatea de a le întâlni. Nu uitați să utilizați corect EDT -ul, evitați să mențineți încuietori pentru o lungă perioadă de timp, să folosiți o comandă de blocare constantă și să luați în considerare utilizarea tehnicilor de programare asincrone. Dacă aveți întrebări sau aveți nevoie de asistență suplimentară, nu ezitați să mă contactați pentru a discuta nevoile dvs. de achiziții.

Referințe

  • „Java eficient” de Joshua Bloch
  • „Concordanța Java în practică” de Brian Goetz și colab.
  • Tutorialele Java:Concordanță
goTop