Rumah >Java >javaTutorial >Mengapa Memanggil `sleep()` pada Thread Dispatch Event Membekukan GUI?
Menggunakan sleep() untuk Satu Thread
Di Java, wait() dan sleep() digunakan untuk mengendalikan penyegerakan thread. Walau bagaimanapun, apabila cuba menggunakan sleep() pada satu utas semasa menjalankan yang lain, isu mungkin timbul.
Masalah:
Apabila memanggil sleep() pada satu thread , kedua-dua utas kelihatan menjeda pelaksanaan untuk tempoh yang ditentukan. Mengapakah gelagat ini berlaku?
Jawapan:
Apabila bekerja dengan Swing GUI, utas unik yang berbeza daripada utas utama dan utas lain bertanggungjawab untuk penciptaannya. Benang ini dikenali sebagai Benang Penghantaran Acara (EDT). Jika sleep() digunakan pada EDT, ia akan menghentikan pelaksanaan sehingga panggilan selesai.
Memandangkan pemprosesan acara GUI berlaku pada EDT, sebarang operasi tidur pada urutan ini menjeda pengendalian acara, menyebabkan UI kelihatan beku sehingga tidur () menyimpulkan.
Penyelesaian:
Elakkan menggunakan Thread.sleep() pada EDT atau thread yang sleep() akan mengakibatkan penyekatan pelaksanaan yang tidak diingini. Sebagai alternatif, pertimbangkan pilihan berikut:
Nota:
Untuk Java 1.6 atau lebih baru, Swing Timer dan Swing Worker ialah pilihan pilihan untuk menangguhkan tindakan pada EDT. Untuk versi Java yang lebih awal, TimerTask atau Thread boleh digunakan bersama-sama dengan blok SwingUtilities/EventQueue#invokeXX untuk memastikan responsif UI.
Atas ialah kandungan terperinci Mengapa Memanggil `sleep()` pada Thread Dispatch Event Membekukan GUI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!