Penjelasan terperinci dan contoh java thread sleep () dan tunggu ()
tidur
1.Sleep adalah metode statis utas. Ini memungkinkan utas yang diimplementasikan oleh Runnable untuk menggunakan metode tidur. Ini juga menghindari memanggil metode tidur () satu sama lain sebelum utas menyebabkan kebuntuan.
2. Tidur () perlu diberikan waktu tidur saat mengeksekusi. Selama tidur (selama benang pemblokiran), CPU akan meninggalkan utas ini dan melakukan tugas -tugas lain. Ketika waktu tidur habis, utas akan secara otomatis bangun, tetapi utas tidak akan segera dieksekusi, tetapi akan menunggu CPU mengalokasikan sumber daya untuk bersaing dengan utas lainnya.
3. Selain itu, jika utas ini memperoleh kunci sebelumnya, kunci tidak akan dilepaskan selama tidur. Program lain yang menunggu kunci mesin ini harus menunggu utas ini bangun dan berlari setelah eksekusi.
Kode terkait tidur
Public Class ThreadTest2 {public static void main (string [] args) {System.out.println ("Mulai tes kami"); Threadsleep sleep = new threadsleep (); coba {thread thread1 = utas baru (tidur, "passer a"); Thread thread2 = utas baru (tidur, "passer b"); thread1.start (); thread2.start (); } catch (Exception e) {E.PrintStackTrace (); } System.out.println ("Test Are Over"); }} class Threadsleep mengimplementasikan runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "katakan: halo tidur !!"); menghitung(); } public void count () {while (count <20) {System.out.println (thread.currentThread (). getName () + "Say: count is" + count); coba {count ++; Thread.sleep (100); } catch (Exception e) {E.PrintStackTrace (); }}}}Log keluaran
Mulailah testtest kami sudah lebih dari pejalan kaki A mengatakan: halo tidur !! PASALBY A mengatakan: hitungan adalah 0 passerby b mengatakan: halo tidur !! Passerby B says : count is 1 Passerby A says : count is 2 Passerby B says : count is 2 Passerby A says : count is 4 Passerby B says : count is 4 Passerby A says : count is 6 Passerby B says : count is 7 Passerby B says : count is 8 Passerby A says : count is 8 Passerby A says : count is 10 Passerby B says : count is 10 Passerby B says : count is 12 Passerby A says : count is 12 Passerby B mengatakan: Hitungan adalah 14 passerby a mengatakan: hitungan adalah 14 passerby a mengatakan: hitungan adalah 16 passerby b mengatakan: hitungan adalah 16 passerby a mengatakan: hitungan adalah 18 passerby b mengatakan: hitungan adalah 18
Melalui log, kita dapat menemukan bahwa Thread A dan Thread B pada dasarnya dieksekusi secara bergantian, tetapi mereka tidak teratur dan memiliki masalah konkurensi.
Situasi ini karena kode menetapkan waktu tidur menjadi 100 milidetik. Karena penghitungan menambah kecepatan eksekusi sangat cepat, utas hampir tidur pada saat yang sama, dan kemudian bangun pada saat yang sama dan menyebabkan konkurensi terjadi.
Selanjutnya, Anda perlu menambahkan blok sinkronisasi untuk memeriksa apakah kunci waktu tidur dilepaskan
Public Class ThreadTest2 {public static void main (string [] args) {System.out.println ("Mulai tes kami"); Threadsleep sleep = new threadsleep (); coba {thread thread1 = utas baru (tidur, "passer a"); Thread thread2 = utas baru (tidur, "passer b"); thread1.start (); thread2.start (); } catch (Exception e) {E.PrintStackTrace (); } System.out.println ("Test Are Over"); }} class Threadsleep mengimplementasikan runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "katakan: halo tidur !!"); menghitung(); } public void count () {while (count <20) {disinkronkan (this) {System.out.println (thread.currentThread (). getName () + "Say: count is" + count); coba {count ++; Thread.sleep (100); } catch (Exception e) {E.PrintStackTrace (); }}}}}}Log keluaran
Mulailah orang tes kami yang mengatakan: halo tidur !! Passerby A mengatakan: hitungan adalah 0test sudah lebih dari passerby b mengatakan: halo tidur !! Passerby A mengatakan: Hitungan adalah 1 orang yang lewat mengatakan: Hitungan adalah 2 orang yang mengatakan: Hitungan adalah 3 passerby a mengatakan: hitungan adalah 4 passerby a mengatakan: hitungan adalah 5 passerby a mengatakan: hitungan adalah 6 passerby a mengatakan: hitungan adalah 7 passerby mengatakan: hitungan adalah 8 pejalan 13-passer A mengatakan: hitungan adalah 14-passer A mengatakan: hitungan adalah 15-passer A mengatakan: Count adalah 16-passer A mengatakan: Count is 17-passer A mengatakan: Count is 18-passer A mengatakan: Count adalah 19-Passer B mengatakan: Count adalah 20
Dapat dilihat dari log yang pada dasarnya mengeksekusi. Ini karena selama tidur, kunci mesin selalu ada di benang A, jadi utas B hanya bisa menunggu sampai benang A melepaskan kunci.
Tunggu
1.Wait () adalah metode kelas objek. Ketika metode tunggu () dipanggil, utas memasuki kumpulan tunggu yang terkait dengan objek dan melepaskan kunci yang dimilikinya.
2. Setelah mengeksekusi tunggu (), Anda harus menggunakan metode notify () atau notifyall () atau mengatur waktu tunggu (tunggu (waktu lama)) untuk membangunkan utas di kumpulan utas tunggu.
3.Wait () harus ditempatkan di blok yang disinkronkan, jika tidak, "Java.lang.illegalmonitorStateException" pengecualian akan dilaporkan saat runtime.
Kode terkait tunggu
Public Class ThreadTest2 {public static void main (string [] args) {System.out.println ("Mulai tes kami"); Threadsleep sleep = new threadsleep (); coba {thread thread1 = utas baru (tidur, "passman a"); Thread thread2 = utas baru (tidur, "passman b"); thread1.start (); thread2.start (); } catch (Exception e) {E.PrintStackTrace (); } System.out.println ("Test Are Over"); }} class Threadsleep mengimplementasikan runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "katakan: halo tidur !!"); menghitung(); } public void count () {while (count <20) {disinkronkan (this) {System.out.println (thread.currentThread (). getName () + "Say: count is" + count); coba {count ++; this.wait (100); } catch (Exception e) {E.PrintStackTrace (); }}}}}}Log keluaran
Mulailah orang tes kami yang mengatakan: halo tidur !! Passerby A mengatakan: hitungan adalah 0test sudah lebih dari passerby b mengatakan: halo tidur !! Passerby B mengatakan: Hitungan adalah 1 passerby a mengatakan: hitungan adalah 2 passerby b mengatakan: hitungan adalah 3 passerby a mengatakan: hitungan adalah 4 passerby b mengatakan: hitungan adalah 5 passerby mengatakan: hitungan adalah 6 passerby b mengatakan: hitungan adalah 7 passerby mengatakan: hitungan adalah 8 pejalan PASSERBY B mengatakan: Hitungan adalah 14 passerby a mengatakan: hitungan adalah 15 passerby b mengatakan: hitungan adalah 16 passerby a mengatakan: hitungan adalah 17 passerby b mengatakan: hitungan adalah 18 passerby a mengatakan: Count is 19
Melalui log, dapat ditemukan bahwa dalam kasus menunggu, kunci akan dilepaskan.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!