Deadlocks boleh menjadi isu penting dalam aplikasi swing, yang sering membawa kepada antara muka pengguna yang tidak responsif dan pengalaman pengguna yang lemah. Sebagai pembekal swing, saya telah menghadapi masalah ini secara langsung dan telah membangunkan strategi untuk mengelakkannya. Dalam catatan blog ini, saya akan berkongsi beberapa amalan terbaik untuk mencegah kebuntuan dalam aplikasi ayunan.
Memahami kebuntuan dalam ayunan
Sebelum kita menyelam ke dalam penyelesaian, penting untuk memahami apa kebuntuan dan bagaimana ia berlaku dalam aplikasi ayunan. Kebuntuan berlaku apabila dua atau lebih benang disekat selama -lamanya, masing -masing menunggu yang lain melepaskan sumber. Dalam ayunan, kebuntuan boleh berlaku apabila benang penghantaran acara (EDT) dan benang lain bersaing untuk sumber yang sama, seperti kunci atau komponen GUI.
EDT bertanggungjawab untuk mengendalikan semua peristiwa yang berkaitan dengan GUI, termasuk lukisan, susun atur, dan input pengguna. Sekiranya EDT disekat, seluruh GUI menjadi tidak bertindak balas. Ini boleh berlaku jika benang lain memegang kunci yang diperlukan oleh EDT, atau jika EDT memegang kunci yang diperlukan oleh benang lain.
Amalan terbaik untuk mengelakkan kebuntuan
1. Gunakan benang penghantaran acara dengan betul
EDT harus digunakan hanya untuk tugas-tugas yang berkaitan dengan GUI. Semua tugas jangka panjang yang lain, seperti permintaan rangkaian atau pertanyaan pangkalan data, harus dilakukan pada benang berasingan. Ini memastikan bahawa EDT tetap responsif dan dapat mengendalikan input pengguna tepat pada masanya.
import javax.swing.*; Swingexample kelas awam {public static void main (string [] args) {// Jadual kerja untuk acara penghantaran acara: // Mencipta dan menunjukkan GUI aplikasi ini. Swingutilities.Invokelater (() -> {// create dan siapkan tetingkap. JFrame Frame = New JFrame ("Swing Example"); Frame.SetDefaultCloseOperation (jFrame.exit_on_close); // Tambah label ke tetingkap. bingkai.pack (); }}
Dalam contoh ini,Swingutilities.invokelaterKaedah digunakan untuk menjadualkan penciptaan dan paparan GUI pada EDT. Ini memastikan bahawa GUI dicipta dan dikemas kini dengan cara yang selamat.
2. Elakkan memegang kunci untuk masa yang lama
Sekiranya anda perlu menggunakan kunci dalam aplikasi swing anda, pastikan anda memegangnya sebagai masa yang singkat. Kunci panjang boleh meningkatkan kemungkinan kebuntuan, terutamanya jika beberapa benang bersaing untuk sumber yang sama.
import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; kelas awam LockExample {Lock Lock Final Private = New ReentRantLock (); public void dosomething () {lock.lock (); Cuba {// Lakukan tugas pendek sambil memegang kunci. System.out.println ("melakukan sesuatu ..."); } akhirnya {lock.unlock (); }}}
Dalam contoh ini,kuncihanya diadakan untuk tempoh tugas pendek. Setelah tugas selesai,kuncidikeluarkan dengan segera.
3. Gunakan pesanan penguncian yang konsisten
Jika anda perlu memperoleh banyak kunci dalam aplikasi swing anda, pastikan anda melakukannya dalam urutan yang konsisten. Ini membantu mencegah keadaan tunggu bulat, yang merupakan penyebab kebuntuan yang biasa.
import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; kelas awam ConsistentLockingExample {Lock Lock Final Private1 = New ReentRantLock (); kunci akhir peribadi lock2 = reentrantLock baru (); kaedah void awam1 () {lock1.lock (); cuba {lock2.lock (); Cuba {// lakukan beberapa tugas sambil memegang kedua -dua kunci. System.out.println ("Kaedah 1 melakukan sesuatu ..."); } akhirnya {lock2.unlock (); }} akhirnya {lock1.unlock (); }} public void method2 () {lock1.lock (); cuba {lock2.lock (); Cuba {// lakukan beberapa tugas sambil memegang kedua -dua kunci. System.out.println ("Kaedah 2 melakukan sesuatu ..."); } akhirnya {lock2.unlock (); }} akhirnya {lock1.unlock (); }}}
Dalam contoh ini, kedua -duanyakaedah1dankaedah2memperoleh kunci dalam urutan yang sama (pertamalock1, kemudianlock2). Ini memastikan bahawa keadaan tunggu bulat tidak dapat berlaku.
4. Gunakan pengaturcaraan tak segerak
Pengaturcaraan Asynchronous boleh menjadi alat yang berkuasa untuk mengelakkan kebuntuan dalam aplikasi ayunan. Dengan menggunakan teknik seperti panggilan balik, niaga hadapan, atau pengaturcaraan reaktif, anda boleh melakukan tugas jangka panjang tanpa menyekat EDT.


import javax.swing.*; import java.util.concurrent.executorservice; import java.util.concurrent.executors; kelas awam AsynceXample {Executor ExecutorService Final Private = Executors.NewSingLethreadExecutor (); public void promeLongTask () {executor.submit (() -> {// melaksanakan tugas yang lama. selesai! ");});}); }}
Dalam contoh ini, tugas jangka panjang dilakukan pada benang berasingan menggunakanExecutorservice. Setelah tugas selesai, GUI dikemas kini pada EDT menggunakanSwingutilities.invokelater.
Produk swing yang disyorkan
Sebagai pembekal swing, saya menawarkan pelbagai produk swing berkualiti tinggi yang sesuai untuk orang dewasa. Lihat kamiOrang dewasa swing deria besar,Ayunan dewasa yang berwarna -warni, danSwing halaman belakang pepejal. Perubahan ini direka untuk memberikan pengalaman yang selesa dan menyeronokkan untuk pengguna dari semua peringkat umur.
Kesimpulan
Deadlocks boleh menjadi masalah yang mengecewakan dalam aplikasi swing, tetapi dengan mengikuti amalan terbaik ini, anda dapat mengurangkan kemungkinan untuk menemui mereka. Ingatlah untuk menggunakan EDT dengan betul, elakkan memegang kunci untuk masa yang lama, gunakan urutan mengunci yang konsisten, dan pertimbangkan untuk menggunakan teknik pengaturcaraan asynchronous. Sekiranya anda mempunyai sebarang pertanyaan atau memerlukan bantuan lanjut, sila hubungi saya untuk membincangkan keperluan perolehan anda.
Rujukan
- "Jawa yang berkesan" oleh Joshua Bloch
- "Java Concurrency in Practice" oleh Brian Goetz et al.
- Tutorial Java:Bersamaan
