Rumah >Java >javaTutorial >Mengapa Memanggil Thread.sleep() pada Satu Thread Membekukan Keseluruhan GUI Swing?
Menggunakan sleep() untuk Satu Thread dalam Persekitaran Threading
Apabila bekerja dengan berbilang thread, adalah penting untuk mengelak daripada menjeda pelaksanaan daripada semua utas apabila hanya satu utas yang perlu menunggu. Malangnya, memanggil Thread.sleep() pada urutan secara tidak sengaja boleh menjejaskan pelaksanaan urutan lain juga.
Dalam kes ini, coretan kod menggunakan JFrame daripada javax.swing.* dan java.awt.* pakej. Benang utama mengendalikan input pengguna untuk papan tic tac toe, manakala benang sekunder bertanggungjawab untuk tindak balas AI. Untuk melaksanakan kelewatan sebelum giliran AI, kod cuba menggunakan ait.sleep(1000). Walau bagaimanapun, kedua-dua utas secara tidak dijangka dijeda selama 1 saat.
Sebab bagi gelagat ini terletak pada fakta bahawa Swing GUI dicipta pada utas mereka sendiri berasingan daripada utas utama. Apabila Thread.sleep() dipanggil pada Event Dispatch Thread (EDT), ia menyebabkan pemprosesan semua acara Swing digantung, termasuk yang diperlukan untuk interaksi pengguna dan kemas kini GUI. Akibatnya, keseluruhan GUI kelihatan beku sehingga panggilan sleep() selesai.
Penyelesaian
Untuk mengelakkan menjeda keseluruhan pelaksanaan, adalah penting untuk menggunakan kaedah alternatif untuk melaksanakan kelewatan pada EDT. Pertimbangkan pilihan berikut:
<code class="java">int delay = 1000; Timer timer = new Timer(delay, new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { // Action to be performed after the delay } }); timer.start();</code>
Jika anda tidak perlu memanipulasi komponen Swing, anda boleh mencipta benang yang berasingan dan menggunakan Thread.sleep() pada benang itu tanpa menjejaskan urutan lain atau GUI.
Atas ialah kandungan terperinci Mengapa Memanggil Thread.sleep() pada Satu Thread Membekukan Keseluruhan GUI Swing?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!