Perbezaan antara Tunggu dan Tidur di Jawa

1. Gambaran keseluruhan

Dalam artikel pendek ini, kita akan melihat kaedah tidur standard () dan tunggu () di Java inti, dan memahami perbezaan dan persamaan di antara mereka.

2. Perbezaan Umum antara Tunggu dan Tidur

Ringkasnya, tunggu () adalah kaedah contoh yang digunakan untuk penyegerakan utas.

Ia boleh dipanggil pada objek apa pun, kerana ia ditentukan tepat di java.lang.Object, tetapi ia hanya boleh dipanggil dari blok yang disegerakkan . Ia melepaskan kunci pada objek sehingga utas lain dapat melompat masuk dan memperoleh kunci.

Sebaliknya, Thread.sleep () adalah kaedah statik yang boleh dipanggil dari konteks apa pun. Thread.sleep () menghentikan jeda semasa dan tidak melepaskan kunci.

Berikut adalah gambaran awal yang sangat sederhana pada kedua-dua teras API ini:

private static Object LOCK = new Object(); private static void sleepWaitExamples() throws InterruptedException { Thread.sleep(1000); System.out.println( "Thread '" + Thread.currentThread().getName() + "' is woken after sleeping for 1 second"); synchronized (LOCK) { LOCK.wait(1000); System.out.println("Object '" + LOCK + "' is woken after" + " waiting for 1 second"); } } 

Menjalankan contoh ini akan menghasilkan output berikut:

Thread 'main' terbangun setelah tidur selama 1 saat

Objek '[dilindungi e-mel]' terbangun setelah menunggu selama 1 saat

3. Bangun Tunggu dan Tidur

Apabila kita menggunakan kaedah sleep () , utas dimulakan setelah selang waktu yang ditentukan, kecuali jika ia terganggu.

Untuk menunggu () , proses bangun tidur sedikit lebih rumit. Kita boleh mengaktifkan benang dengan memanggil kaedah notify () atau notifyAll () pada monitor yang sedang ditunggu.

Gunakan notifyAll () dan bukannya notify () semasa anda ingin membangunkan semua utas yang berada dalam keadaan menunggu. Begitu juga dengan kaedah wait () itu sendiri, notify () , dan notifyAll () mesti dipanggil dari konteks yang diselaraskan.

Contohnya, inilah cara anda boleh menunggu :

synchronized (b) { while (b.sum == 0) { System.out.println("Waiting for ThreadB to complete..."); b.wait(); } System.out.println("ThreadB has completed. " + "Sum from that thread is: " + b.sum); }

Dan kemudian, di sini adalah cara thread lain, maka boleh bangun thread menunggu - dengan menelefon memberitahu () pada monitor :

int sum; @Override public void run() { synchronized (this) { int i = 0; while (i < 100000) { sum += i; i++; } notify(); } }

Menjalankan contoh ini akan menghasilkan output berikut:

Menunggu ThreadB selesaiā€¦

ThreadB telah selesai. Jumlah dari utas itu ialah: 704982704

4. Kesimpulan

Ini adalah primer cepat untuk semantik menunggu dan tidur di Jawa.

Secara umum, kita harus menggunakan sleep () untuk mengawal masa pelaksanaan satu utas dan menunggu () untuk penyegerakan multi-utas. Sememangnya, ada banyak lagi yang boleh diterokai - setelah memahami asasnya dengan baik.

Seperti biasa, anda boleh melihat contoh yang diberikan dalam artikel ini di GitHub.