Pertanyaan Perbedaan antara menunggu () dan tidur ()


Apa perbedaan antara a wait() dan sleep() di Threads?

Apakah pemahaman saya itu a wait()-ing Thread masih dalam mode running dan menggunakan siklus CPU tetapi a sleep()-ing tidak mengkonsumsi siklus CPU yang benar?

Kenapa kita punya kedua  wait() dan sleep(): bagaimana implementasinya bervariasi pada tingkat yang lebih rendah?


1026
2018-06-24 06:48


asal


Jawaban:


SEBUAH wait dapat "dibangunkan" oleh panggilan utas lainnya notify pada monitor yang sedang menunggu sementara a sleep tidak bisa. Juga sebuah wait (dan notify) harus terjadi dalam satu blok synchronized pada objek monitor sedangkan sleep tidak:

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

Pada titik ini thread yang sedang dieksekusi menunggu dan lepaskan monitor. Mungkin ada untaian lain

synchronized (mon) { mon.notify(); }

(Pada yang sama mon objek) dan benang pertama (dengan asumsi itu adalah satu-satunya benang yang menunggu di monitor) akan bangun.

Anda juga bisa menelepon notifyAll jika lebih dari satu utas menunggu di monitor - ini akan bangun semuanya. Namun, hanya satu dari benang yang dapat mengambil monitor (ingat bahwa wait ada di dalam synchronized block) dan melanjutkan - yang lain kemudian akan diblokir sampai mereka dapat memperoleh kunci monitor.

Hal lain adalah Anda menelepon wait di Object sendiri (Anda menunggu pada monitor objek) sedangkan Anda menelepon sleep di Thread.

Namun, titik lain adalah yang bisa Anda dapatkan wakeup palsu dari wait (yaitu utas yang menunggu resume tanpa alasan yang jelas). Kamu harus selalu wait sementara berputar pada beberapa kondisi sebagai berikut:

synchronized {
    while (!condition) { mon.wait(); }
}

739
2018-06-24 06:50



Satu perbedaan utama yang belum disebutkan adalah bahwa ketika tidur, Thread tidak tidak lepaskan kunci yang dipegangnya, sambil menunggu melepaskan kunci pada objek itu wait() dipanggil.

synchronized(LOCK) {
    Thread.sleep(1000); // LOCK is held
}


synchronized(LOCK) {
    LOCK.wait(); // LOCK is not held
}

285
2018-06-24 07:06



saya menemukan Link ini membantu (referensi mana posting ini). Ini menempatkan perbedaan antara sleep(), wait(), dan yield() dalam istilah manusia. (seandainya tautannya mati, saya telah menyertakan posting di bawah ini dengan markup tambahan)

Semuanya akhirnya menuju ke penjadwal OS, yang mana   memberikan waktu kepada proses dan utas.

sleep(n) kata “Saya selesai dengan jeda waktu saya, dan tolong jangan beri saya   satu lagi untuk setidaknya milidetik. ” OS bahkan tidak mencoba   menjadwalkan benang tidur hingga waktu yang diminta telah berlalu.

yield() kata “Saya selesai dengan kalkulasi waktu saya, tetapi saya masih harus bekerja   melakukan." OS ini bebas untuk segera memberikan thread kalkulasi waktu lainnya,   atau untuk memberikan beberapa thread lain atau memproses CPU yang menghasilkan thread   menyerah begitu saja.

.wait() kata “Saya selesai dengan kalkulasi waktu saya. Jangan beri saya yang lain   timeslice sampai seseorang memanggil notify (). " Seperti sleep(), OS tidak akan   bahkan mencoba menjadwalkan tugas Anda kecuali seseorang memanggil notify() (atau salah satu dari   beberapa skenario bangun lain terjadi).

Thread juga kehilangan sisa timeslice mereka ketika mereka melakukan   memblokir IO dan di bawah beberapa keadaan lain. Jika sebuah thread berfungsi   melalui seluruh waktu, OS secara paksa menguasai kira-kira sebagai   jika yield()telah dipanggil, sehingga proses lain dapat berjalan.

Anda jarang membutuhkan yield(), tetapi jika Anda memiliki aplikasi komputasi-berat dengan   batas-batas tugas logis, menyisipkan a yield()  mungkin memperbaiki sistem   tanggap (dengan mengorbankan waktu - switch konteks, bahkan adil   ke OS dan kembali, tidak gratis). Ukur dan uji terhadap gol Anda   peduli, seperti biasa.


198
2017-08-05 19:32



Ada banyak jawaban di sini tetapi saya tidak dapat menemukan perbedaan semantik yang disebutkan di atas.

Ini bukan tentang benang itu sendiri; kedua metode diperlukan karena mereka mendukung kasus penggunaan yang sangat berbeda.

sleep() mengirim Thread untuk tidur seperti sebelumnya, itu hanya mengemas konteks dan berhenti mengeksekusi untuk waktu yang telah ditentukan. Jadi untuk membangunkannya sebelum waktunya, Anda perlu mengetahui referensi Thread. Ini bukan situasi umum dalam lingkungan multi-berulir. Ini sebagian besar digunakan untuk sinkronisasi waktu (mis. Bangun tepat 3,5 detik) dan / atau keadilan berkode keras (hanya tidur sebentar dan biarkan orang lain bekerja).

wait()Sebaliknya, adalah mekanisme sinkronisasi thread (atau pesan) yang memungkinkan Anda untuk memberitahukan Thread yang tidak memiliki referensi tersimpan (atau perawatan). Anda dapat menganggapnya sebagai pola publikasi-berlangganan (wait == berlangganan dan notify() == publikasikan). Pada dasarnya menggunakan notify () Anda mengirim pesan (yang mungkin bahkan tidak diterima sama sekali dan biasanya Anda tidak peduli).

Singkatnya, Anda biasanya menggunakan sleep() untuk sinkronisasi waktu dan wait() untuk sinkronisasi multi-benang.

Mereka dapat diimplementasikan dengan cara yang sama di OS yang mendasarinya, atau tidak sama sekali (karena versi Java sebelumnya tidak memiliki multithreading nyata; mungkin beberapa VM kecil tidak melakukan itu juga). Jangan lupa Java berjalan pada VM, sehingga kode Anda akan diubah dalam sesuatu yang berbeda sesuai dengan VM / OS / HW yang berjalan di dalamnya.


64
2018-04-19 10:38



Di sini, saya telah membuat daftar beberapa perbedaan penting antara wait() dan sleep() metode.
PS:  Juga klik pada tautan untuk melihat kode perpustakaan (kerja internal, hanya bermain sedikit untuk pemahaman yang lebih baik). 

Tunggu()

  1. wait() metode melepaskan kunci.
  2. wait() adalah metode Object kelas.
  3. wait() adalah metode non-statis - public final void wait() throws InterruptedException { //...}
  4. wait() harus diberitahukan oleh notify() atau notifyAll() metode.
  5. wait() metode perlu dipanggil dari loop untuk menangani alarm palsu.

  6. wait() metode harus dipanggil dari konteks yang disinkronkan (yaitu metode atau blok tersinkronisasi), jika tidak maka akan dibuang IllegalMonitorStateException

tidur()

  1. sleep() metode tidak melepaskan kunci.
  2. sleep() adalah metode java.lang.Thread kelas.
  3. sleep() adalah metode statis - public static void sleep(long millis, int nanos) throws InterruptedException { //... }
  4. setelah waktu yang ditentukan, sleep() selesai.
  5. sleep() lebih baik tidak memanggil dari loop (yaitu. lihat kode di bawah ini).
  6. sleep() dapat dipanggil dari mana saja. tidak ada persyaratan khusus.

Ref: Perbedaan antara Tunggu dan Tidur

Potongan kode untuk memanggil metode tunggu dan tidur

synchronized(monitor){
    while(condition == true){ 
        monitor.wait()  //releases monitor lock
    }

    Thread.sleep(100); //puts current thread on Sleep    
}

thread transition to different thread states


43
2017-12-28 06:18



Ada beberapa perbedaan catatan kunci yang saya simpulkan setelah bekerja menunggu dan tidur, pertama lihat contoh menggunakan wait () dan sleep ():

Contoh 1: menggunakan Tunggu() dan tidur():

synchronized(HandObject) {
    while(isHandFree() == false) {
        /* Hand is still busy on happy coding or something else, please wait */
        HandObject.wait();
    }
}

/* Get lock ^^, It is my turn, take a cup beer now */
while (beerIsAvailable() == false) {
    /* Beer is still coming, not available, Hand still hold glass to get beer,
       don't release hand to perform other task */
    Thread.sleep(5000);
}

/* Enjoy my beer now ^^ */
drinkBeers();

/* I have drink enough, now hand can continue with other task: continue coding */
setHandFreeState(true);
synchronized(HandObject) {
    HandObject.notifyAll();
}

Biarkan kejelasan beberapa catatan kunci:

  1. Panggil:
    • wait (): Panggilan di thread saat ini yang menahan HandObject Object
    • sleep (): Panggilan di Thread menjalankan tugas mendapatkan bir (adalah metode kelas sehingga mempengaruhi pada thread yang sedang berjalan)
  2. Disinkronkan:
    • wait (): ketika synchronized multi thread mengakses Objek yang sama (HandObject) (Saat membutuhkan komunikasi antara lebih dari satu thread (thread execute coding, thread execute get beer) akses pada object yang sama HandObject)
    • sleep (): ketika menunggu kondisi untuk melanjutkan eksekusi (Menunggu bir tersedia)
  3. Tahan kunci:
    • wait (): lepaskan kunci untuk objek lain yang memiliki peluang untuk dieksekusi (HandObject gratis, Anda dapat melakukan pekerjaan lain)
    • tidur (): terus kunci setidaknya t kali (atau sampai interupsi) (Pekerjaan saya masih belum selesai, saya terus menahan kunci dan menunggu beberapa kondisi untuk melanjutkan)
  4. Kondisi bangun tidur:
    • wait (): hingga call notify (), notifyAll () dari objek
    • sleep (): hingga setidaknya waktu kedaluwarsa atau panggilan interupsi
  5. Dan poin terakhir adalah gunakan kapan sebagai estani menunjukkan:

Anda biasanya menggunakan sleep () untuk sinkronisasi waktu dan menunggu () untuk   sinkronisasi multi-benang.

Tolong benarkan saya jika saya salah.


28
2018-05-19 06:59



Perbedaan antara menunggu () dan tidur ()

  • Perbedaan mendasarnya adalah wait() adalah dari Object dan sleep() adalah metode statis Thread.

  • Perbedaan utamanya adalah itu wait() lepaskan kunci sementara sleep() tidak melepaskan kunci apa pun saat menunggu.

  • Itu wait() digunakan untuk komunikasi antar-benang sementara sleep() digunakan untuk memperkenalkan jeda pada eksekusi, umumnya.

  • Itu wait() harus memanggil dari dalam sinkronisasi atau yang lain kita dapatkan IllegalMonitorStateException  sementara sleep()  dapat menelepon ke mana saja.

  • Untuk memulai utas lagi dari wait(), Anda harus menelepon notify() atau notifyAll(). Saat di sleep(), thread mulai setelah interval ms / detik yang ditentukan.

Kesamaan yang membantu memahami

  • Keduanya membuat utas saat ini masuk ke dalam Bukan Runnable negara.
  • Keduanya native metode.

21
2017-07-24 06:48