Yongkang  Шуангю  Индустрия  и  Търговия  Co.,  ООД

Как да избегнем задънените устройства в приложението за люлеене?

Jun 06, 2025

Мързелите могат да бъдат важен проблем в приложенията за суинг, често водещи до неотговарящи потребителски интерфейси и лошо потребителско изживяване. Като доставчик на люлка се сблъсках с тези проблеми от първа ръка и съм разработил стратегии, за да ги избегна. В тази публикация в блога ще споделя някои от най -добрите практики за предотвратяване на безизходици в приложения за люлеене.

Разбиране на безизходиците в люлка

Преди да се потопим в решенията, важно е да разберем какви са задънените лица и как се появяват в приложенията на люлеенето. Задънена улица се случва, когато две или повече нишки са блокирани завинаги, като всяка от тях чака другата да пусне ресурс. В Swing, безизходиците могат да възникнат, когато нишката за изпращане на събитие (EDT) и други нишки се конкурират за същите ресурси, като ключалки или компоненти на GUI.

EDT е отговорен за обработката на всички събития, свързани с GUI, включително рисуване, оформление и въвеждане на потребители. Ако EDT е блокиран, целият GUI става неотговарящ. Това може да се случи, ако друга нишка държи ключалка, от която се нуждае EDT, или ако EDT държи ключалка, от която се нуждае друга нишка.

Най -добри практики за избягване на безизходици

1. Използвайте правилно нишката за изпращане на събитието

EDT трябва да се използва само за задачи, свързани с GUI. Всички други дългогодишни задачи, като мрежови заявки или заявки за база данни, трябва да се изпълняват на отделни нишки. Това гарантира, че EDT остава отзивчив и може да се справи своевременно в въвеждането на потребители.

импортиране на javax.swing.*; Public Class Swingexample {public static void main (String [] args) {// Планирайте задача за DISPATH DISTACH THENBLE: // Създаване и показване на GUI на това приложение. Swingutility.invokelater (() -> {// Създаване и настройка на прозореца. Jframe frame = нов Jframe ("Swing Пример"); Frame.SetDefaultCloseOperation (jframe.exit_on_close); // Добавяне на етикет към прозореца. frame.pack (); }}

В този пример,Swingutility.invokelaterМетодът се използва за планиране на създаването и показването на GUI на EDT. Това гарантира, че GUI е създаден и актуализиран по начин за безопасност на нишката.

2. Избягвайте да държите брави за дълго време

Ако трябва да използвате ключалки в приложението си за люлеене, не забравяйте да ги задържите възможно най -кратко време. Дългопоставените брави могат да увеличат вероятността от безизходици, особено ако множество нишки се състезават за едни и същи ресурси.

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 (); Опитайте {// Изпълнете кратка задача, докато държите ключалката. System.out.println ("правене на нещо ..."); } накрая {lock.unlock (); }}}

В този пример,заключванесе държи само за продължителността на кратката задача. След като задачата приключи,заключванесе пуска веднага.

3. Използвайте последователна заключваща поръчка

Ако трябва да придобиете няколко брави в приложението си за люлеене, не забравяйте да го направите в последователен ред. Това помага за предотвратяване на кръгови условия на изчакване, които са често срещана причина за безизходица.

import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; Public Class consiveCtentLockingExample {private Final Lock Lock1 = нов Reentrantlock (); частен окончателен заключващ заключване2 = нов Reentrantlock (); public void метод1 () {lock1.lock (); опитайте {lock2.lock (); Опитайте {// Изпълнете някаква задача, докато държите и двете ключалки. System.out.println ("Метод 1 прави нещо ..."); } накрая {lock2.unlock (); }} най -накрая {lock1.unlock (); }} public void метод2 () {lock1.lock (); опитайте {lock2.lock (); Опитайте {// Изпълнете някаква задача, докато държите и двете ключалки. System.out.println ("Метод 2 прави нещо ..."); } накрая {lock2.unlock (); }} най -накрая {lock1.unlock (); }}}

В този пример и дветеМетод1иМетод2придобийте ключалките в същия ред (първоLock1, тогаваLock2). Това гарантира, че не може да възникне състояние на кръгово изчакване.

4. Използвайте асинхронно програмиране

Асинхронното програмиране може да бъде мощен инструмент за избягване на безизходици в люлеещи се приложения. Използвайки техники като обратни повиквания, фючърси или реактивно програмиране, можете да изпълнявате дългосрочни задачи, без да блокирате EDT.

Big Colorful Adult Swing

импортиране на javax.swing.*; импортиране java.util.concurrent.executorservice; импортиране java.util.concurrent.executors; Asyncexmame Public Class {private final ExecutorService Executor = Executors.newsingLethreadexecutor (); public void performLongTask () {executor.submit (() -> {// изпълнете дългосрочна задача. Опитайте {thread.sleep (5000);} улов (прекъсване на eDt. "Дълга задача, завършена!");}); }}

В този пример дългогодишната задача се изпълнява на отделна нишка с помощта наExecutorService. След като задачата приключи, GUI се актуализира на EDT, използвайкиSwingutility.invokelater.

Препоръчителни продукти за люлеене

Като доставчик на суинг, аз предлагам гама от висококачествени суинг продукти, подходящи за възрастни. Вижте нашитеГолеми сензорни люлеещи се възрастни,Голяма цветна люлка за възрастнииСолидна заден двор. Тези люлки са проектирани да осигурят удобно и приятно изживяване за потребителите от всички възрасти.

Заключение

Стъпките могат да бъдат разочароващ проблем в приложенията на суинг, но като следвате тези най -добри практики, можете значително да намалите вероятността да ги срещнете. Не забравяйте да използвате правилно EDT, избягвайте да държите брави за дълго време, използвайте последователна заключваща поръчка и помислете за използването на асинхронни техники за програмиране. Ако имате някакви въпроси или се нуждаете от допълнителна помощ, не се колебайте да се свържете с мен, за да обсъдите нуждите от вашите поръчки.

ЛИТЕРАТУРА

  • "Ефективна Java" от Джошуа Блок
  • „Java Concurrency on Practice“ от Brian Goetz et al.
  • Уроците на Java:Паралелност
goTop