Rumah >Java >javaTutorial >Mengapa Memanggil `sleep()` pada Thread Dispatch Event Membekukan GUI?

Mengapa Memanggil `sleep()` pada Thread Dispatch Event Membekukan GUI?

Patricia Arquette
Patricia Arquetteasal
2024-11-03 13:39:03501semak imbas

Why Does Calling `sleep()` on the Event Dispatch Thread Freeze the 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:

  • Pemasa Ayunan: Membolehkan untuk menangguhkan tindakan pada EDT.
  • Pekerja Ayunan: Menyediakan mekanisme yang mudah untuk menjalankan tugas secara tidak segerak pada urutan yang berasingan.
  • TimerTask: Digunakan dengan java.util.Timer untuk menjadualkan tugas untuk dijalankan pada selang waktu tertentu.
  • Thread: Secara pilihan, anda boleh membuat thread berasingan dan menggunakan Thread.sleep() padanya, walaupun ini biasanya tidak disyorkan.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn