Perbedaan Antara Tunggu dan Tidur di Java

1. Ikhtisar

Dalam artikel singkat ini, kita akan melihat metode sleep () dan wait () standar di inti Java, dan memahami perbedaan dan persamaan di antara keduanya.

2. Perbedaan Umum Antara Menunggu dan Tidur

Sederhananya, wait () adalah metode instance yang digunakan untuk sinkronisasi utas.

Itu bisa dipanggil pada objek apa pun, seperti yang didefinisikan langsung di java.lang.Object, tapi itu hanya bisa dipanggil dari blok tersinkronisasi . Ini melepaskan kunci pada objek sehingga utas lain dapat masuk dan mendapatkan kunci.

Di sisi lain, Thread.sleep () adalah metode statis yang bisa dipanggil dari konteks apa pun. Thread.sleep () menjeda utas saat ini dan tidak melepaskan kunci apa pun.

Berikut adalah tampilan awal yang sangat sederhana dari dua API inti ini dalam tindakan:

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 keluaran berikut:

Benang 'utama' dibangunkan setelah tidur selama 1 detik

Objek '[email protected]' diaktifkan setelah menunggu selama 1 detik

3. Bangun Tunggu dan Tidur

Saat kita menggunakan metode sleep () , utas akan dimulai setelah interval waktu yang ditentukan, kecuali jika terputus.

Untuk wait () , proses bangun sedikit lebih rumit. Kita bisa membangunkan utas dengan memanggil metode notify () atau notifyAll () pada monitor yang sedang menunggu.

Gunakan notifyAll () sebagai ganti notify () saat Anda ingin membangunkan semua utas yang berada dalam status menunggu. Sama halnya dengan metode wait () itu sendiri, notify () , dan notifyAll () harus dipanggil dari konteks yang disinkronkan.

Misalnya, berikut cara Anda bisa 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); }

Lalu, inilah cara utas lain dapat mengaktifkan utas tunggu - dengan memanggil notify () di monitor :

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

Menjalankan contoh ini akan menghasilkan keluaran berikut:

Menunggu ThreadB selesai…

ThreadB telah selesai. Jumlah dari utas itu adalah: 704982704

4. Kesimpulan

Ini adalah panduan singkat tentang semantik menunggu dan tidur di Java.

Secara umum, kita harus menggunakan sleep () untuk mengontrol waktu eksekusi dari satu thread dan wait () untuk sinkronisasi multi-thread. Tentu, masih banyak lagi yang bisa dijelajahi - setelah memahami dasar-dasarnya dengan baik.

Seperti biasa, Anda dapat melihat contoh yang diberikan dalam artikel ini di GitHub.