Kilitlenme, salıncak uygulamalarında önemli bir sorun olabilir, bu da genellikle tepkisiz kullanıcı arayüzlerine ve zayıf bir kullanıcı deneyimine yol açar. Bir salıncak tedarikçisi olarak, bu sorunlarla ilk elden karşılaştım ve bunlardan kaçınmak için stratejiler geliştirdim. Bu blog yazısında, salıncak uygulamalarındaki çıkmazları önlemek için en iyi uygulamalardan bazılarını paylaşacağım.
Salıncaktaki kilitlenmeleri anlamak
Çözümlere dalmadan önce, çıkmazların ne olduğunu ve salıncak uygulamalarında nasıl ortaya çıktıklarını anlamak önemlidir. İki veya daha fazla iş parçacığı sonsuza dek engellendiğinde, her biri diğerinin bir kaynağı serbest bırakmasını beklediğinde bir çıkmaz olur. Salıncakta, olay dağıtım iş parçacığı (EDT) ve diğer iş parçacıkları, kilitler veya GUI bileşenleri gibi aynı kaynaklar için yarıştığında kilitlenmeler meydana gelebilir.
EDT, boyama, düzen ve kullanıcı girişi dahil olmak üzere GUI ile ilgili tüm olayları işlemekten sorumludur. EDT engellenirse, tüm GUI tepkisiz hale gelir. Bu, başka bir iş parçacığı EDT'nin ihtiyaç duyduğu bir kilidi tutarsa veya EDT'nin başka bir iş parçacığının ihtiyaç duyduğu bir kilit tutarsa olabilir.
Kilitlenmeden kaçınmak için en iyi uygulamalar
1. Olay Dispatch iş parçacığını doğru kullanın
EDT sadece GUI ile ilgili görevler için kullanılmalıdır. Ağ istekleri veya veritabanı sorguları gibi diğer tüm uzun süredir devam eden görevler ayrı iş parçacıklarında gerçekleştirilmelidir. Bu, EDT'nin duyarlı kalmasını ve kullanıcı girişini zamanında işleyebilmesini sağlar.
ithal javax.swing.*; public class swingExample {public static void main (String [] args) {// Etkinlik dağıtım iş parçacığı için bir iş planlayın: // bu uygulamanın GUI'sini oluşturma ve gösterme. Swingutility.invokelater (() -> {// pencereyi oluşturun ve ayarlayın. Jframe frame = yeni jframe ("salıncak örneği"); frame.setdeultcloseoPeration (jframe.exit_on_close); // pencereye bir etiket ekleyin. Pencere. }}
Bu örnekte,Swingutility.invokelaterYöntem, EDT'de GUI'nin oluşturulmasını ve gösterilmesini planlamak için kullanılır. Bu, GUI'nin iş parçacığı güvenli bir şekilde oluşturulmasını ve güncellenmesini sağlar.
2. Kilitleri uzun süre tutmaktan kaçının
Salıncak uygulamanızda kilitler kullanmanız gerekiyorsa, bunları mümkün olduğunca kısa bir süre tuttuğunuzdan emin olun. Uzun süredir devam eden kilitler, özellikle aynı kaynaklar için birden fazla iş parçacığı rekabet ediyorsa, kilitlenme olasılığını artırabilir.
İçe Aktar Java.util.concurrent.locks.lock; İçe Aktarma Java.util.Concurrent.Locks.ReRenTrocklock; public class locKexample {özel final kilidi = new Reentrantlock (); public void dosomething () {lock.lock (); Kilidi tutarken {// kısa bir görev gerçekleştirin. System.out.println ("bir şeyler yapmak ..."); } nihayet {lock.unlock (); }}}
Bu örnekte,kilitsadece kısa görev süresince tutulur. Görev tamamlandıktan sonrakilithemen serbest bırakıldı.
3. Tutarlı bir kilitleme siparişi kullanın
Swing uygulamanızda birden fazla kilit almanız gerekiyorsa, bunu tutarlı bir sırayla yaptığınızdan emin olun. Bu, çıkmazların yaygın bir nedeni olan dairesel bekleme koşullarını önlemeye yardımcı olur.
İçe Aktar Java.util.concurrent.locks.lock; İçe Aktarma Java.util.Concurrent.Locks.ReRenTrocklock; public class ConcentLockingExample {özel final lock lock1 = new Reentrantlock (); Özel Final Lock2 = Yeni Reentrantlock (); public void method1 () {lock1.lock (); {lock2.lock (); {// her iki kilit tutarken bazı görevleri gerçekleştirin. System.out.println ("Yöntem 1 bir şey yapıyor ..."); } nihayet {lock2.unlock (); }} nihayet {lock1.unlock (); }} public void method2 () {lock1.lock (); {lock2.lock (); {// her iki kilit tutarken bazı görevleri gerçekleştirin. System.out.println ("Yöntem 2 bir şey yapıyor ..."); } nihayet {lock2.unlock (); }} nihayet {lock1.unlock (); }}}
Bu örnekte her ikisi deMetod1VeMetod2Kilitleri aynı sırayla edin (ilk önceLock1, Daha sonraKilit2). Bu, dairesel bir bekleme koşulunun gerçekleşememesini sağlar.
4. Asenkron programlama kullanın
Asenkron programlama, salıncak uygulamalarındaki çıkmazlardan kaçınmak için güçlü bir araç olabilir. Geri arama, vadeli işlemler veya reaktif programlama gibi teknikler kullanarak, EDT'yi engellemeden uzun süredir devam eden görevleri gerçekleştirebilirsiniz.


ithal javax.swing.*; İçe Aktar Java.util.Concurrent.ExecutorService; ithal java.util.concurrent.executors; public class asyncexample {private Final ExecutorService Executor = Executors.newsingLeThreadExecutor (); public void icragtask () {Executor.submit (() -> {// uzun süredir devam eden bir görev gerçekleştirin. Try {Thread.sleep (5000);} Catch (InterruptedException E) {E.printStackTrace ();} // EDT (swingututies.invokelater (nusctions.invokelater (nusginges.invokelater (nusginges.invokelater (noPties. görev tamamlandı! ");});}); }}
Bu örnekte, uzun süredir devam eden görev, birExecutorservice. Görev tamamlandıktan sonra, GUI EDT'de güncellenir.Swingutility.invokelater.
Önerilen Salıncak Ürünleri
Bir salıncak tedarikçisi olarak, yetişkinler için uygun bir dizi yüksek kaliteli salıncak ürünü sunuyorum. Bize bakBüyük Duyusal Salıncak Yetişkinleri-Büyük renkli yetişkin salınımı, VeSağlam arka bahçe salınımı. Bu dalgalanmalar, her yaştan kullanıcılar için rahat ve keyifli bir deneyim sağlamak için tasarlanmıştır.
Çözüm
Kilitlenmeler salıncak uygulamalarında sinir bozucu bir sorun olabilir, ancak bu en iyi uygulamaları takip ederek, bunlarla karşılaşma olasılığını önemli ölçüde azaltabilirsiniz. EDT'yi doğru kullanmayı unutmayın, kilitleri uzun süre tutmaktan kaçının, tutarlı bir kilitleme sırası kullanın ve eşzamansız programlama tekniklerini kullanmayı düşünün. Herhangi bir sorunuz varsa veya daha fazla yardıma ihtiyacınız varsa, tedarik ihtiyaçlarınızı görüşmek için benimle iletişime geçmekten çekinmeyin.
Referanslar
- Joshua Bloch tarafından "Etkili Java"
- Brian Goetz ve ark.
- Java Öğreticileri:Eşzamanlılık
