Apa perbedaan antara a wait()
dan sleep()
di Thread?
Apakah pemahaman saya bahwa wait()
Thread a -ing masih dalam mode berjalan dan menggunakan siklus CPU tetapi a sleep()
-ing tidak mengkonsumsi siklus CPU yang benar?
Mengapa kita memiliki keduanya wait()
dan sleep()
: bagaimana implementasinya bervariasi di tingkat yang lebih rendah?
java
multithreading
sleep
java-threads
Kutu buku
sumber
sumber
Jawaban:
A
wait
dapat "dibangunkan" oleh utas lainnya yang memanggilnotify
monitor yang sedang menunggu sedangkan yangsleep
tidak bisa. Jugawait
(dannotify
) harus terjadi pada bloksynchronized
pada objek monitor sedangkansleep
tidak:Pada titik ini utas yang saat ini dijalankan menunggu dan melepaskan monitor . Utas lain mungkin berhasil
(pada
mon
objek yang sama ) dan utas pertama (dengan asumsi itu adalah satu-satunya utas yang menunggu di monitor) akan bangun.Anda juga dapat menelepon
notifyAll
jika lebih dari satu utas menunggu pada monitor - ini akan membangunkan semuanya . Namun, hanya satu utas yang akan dapat meraih monitor (ingat bahwawait
ada dalam asynchronized
blok) dan melanjutkan - yang lainnya kemudian akan diblokir sampai mereka dapat memperoleh kunci monitor.Hal lain adalah bahwa Anda menelepon
wait
padaObject
dirinya sendiri (yaitu Anda menunggu di monitor obyek) sedangkan Anda meneleponsleep
diThread
.Namun titik lain adalah bahwa Anda bisa mendapatkan wakeups palsu dari
wait
(yaitu benang yang menunggu resume tanpa alasan yang jelas). Anda harus selaluwait
berputar sementara pada beberapa kondisi sebagai berikut:sumber
wait
Sayanotify
biasanya digunakan untuk menunggu utas lainnya menyelesaikan tugas, atau menunggu hingga kondisi tertentu terpenuhi.Satu perbedaan kunci yang belum disebutkan adalah bahwa saat tidur Thread tidak melepaskan kunci yang dimilikinya, sementara menunggu melepaskan kunci pada objek yang
wait()
dipanggil.sumber
sleep
memegang kunci java , tetapi tidak. Untuk memiliki perbandingan yang adil, kami akan membandingkansynchronized(OUTER_LOCK){ Thread.sleep(1000); }
dengansynchronized(OUTER_LOCK){ synchronized(LOCK){LOCK.wait();} }
dan kami dapat melihat bahwa kedua instruksi tidak merilisOUTER_LOCK
. Jika ada perbedaan, kita dapat mengatakan bahwasleep
itu tidak secara eksplisit menggunakan kunci java , tetapi pertanyaannya adalah tentang kutipan "bagaimana implementasinya bervariasi pada tingkat yang lebih rendah?" tanda kutip.wait()
dikaitkan dengan kondisi kunci paling dalam yang dipanggilnya, dalam contoh kode Anda,wait()
hanya dapat dilepaskanLOCK
dan tidakOUTER_LOCK
. Begitulah monitor Java dirancang. Perbandingan yang adil adalahsynchronized(OUTER_LOCK){ synchronized(LOCK) { Thread.sleep(1000); } }
dansynchronized(OUTER_LOCK){ synchronized(LOCK) { LOCK.wait(); } }
. Dalam hal inisleep()
akan memegang kedua kunci sementarawait()
akan melepaskanLOCK
tetapi masih menahanOUTER_LOCK
Saya menemukan posting ini bermanfaat. Ini menempatkan perbedaan antara
Thread.sleep()
,Thread.yield()
danObject.wait()
dalam istilah manusia. Kutipan:sumber
sleep(n)
secara implisit mengatakan bahwa utas yang saat ini berjalan melepaskan monitor kunci secara sukarela, yang tidak benar . Kutipan dari Thread's javadoc : "Thread tidak kehilangan kepemilikan monitor apa pun."sleep
tidak memiliki perilaku khusus mengenai monitor daripada panggilan metode Java lainnya, yaitu, ia tidak berinteraksi atau memodifikasinya dengan cara apa pun. Jika Anda akan mengatakan sesuatu tentang monitor, Anda harus menentukan bahwawait
, selain hal-hal yang disebutkan di atas, untuk sementara waktu melepaskan kunci pada objek yang dipanggil.wait(n)
untuk membandingkansleep(n)
. Tidak ada gunanya membandingkan menggunakan no-arg satu.Ada banyak jawaban di sini tetapi saya tidak dapat menemukan perbedaan semantik yang disebutkan di atas.
Ini bukan tentang utas itu sendiri; kedua metode diperlukan karena mereka mendukung kasus penggunaan yang sangat berbeda.
sleep()
mengirim Thread ke mode sleep seperti sebelumnya, itu hanya mengemas konteks dan berhenti mengeksekusi untuk waktu yang telah ditentukan. Jadi untuk membangunkannya sebelum batas waktu, Anda perlu mengetahui referensi Thread. Ini bukan situasi umum di lingkungan multi-utas. Ini sebagian besar digunakan untuk sinkronisasi waktu (misalnya bangun tepat 3,5 detik) dan / atau keadilan hard-kode (hanya tidur sebentar dan biarkan thread lain bekerja).wait()
, sebaliknya, adalah mekanisme sinkronisasi utas (atau pesan) yang memungkinkan Anda memberi tahu utas yang tidak memiliki referensi tersimpan (atau peduli). Anda dapat menganggapnya sebagai pola terbitkan-berlangganan (wait
== berlangganan dannotify()
== terbitkan). Pada dasarnya menggunakan notify () Anda mengirim pesan (yang bahkan mungkin tidak diterima sama sekali dan biasanya Anda tidak peduli).Singkatnya, Anda biasanya menggunakan
sleep()
sinkronisasi waktu dan sinkronisasiwait()
multi-utas.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, jadi kode Anda akan ditransformasikan dalam sesuatu yang berbeda sesuai dengan VM / OS / HW yang dijalankannya.
sumber
Di sini, saya telah membuat daftar beberapa perbedaan penting antara
wait()
dansleep()
metode.PS: Juga klik tautan untuk melihat kode perpustakaan (internal bekerja, hanya bermain-main sedikit untuk pemahaman yang lebih baik).
Tunggu()
wait()
Metode melepaskan kunci.wait()
adalah metodeObject
kelas.wait()
adalah metode non-statis -public final void wait() throws InterruptedException { //...}
wait()
harus diberitahukan olehnotify()
ataunotifyAll()
metode.wait()
Metode perlu dipanggil dari loop untuk menangani alarm palsu.wait()
Metode harus dipanggil dari konteks yang disinkronkan (yaitu metode atau blok yang disinkronkan), jika tidak ia akan melemparIllegalMonitorStateException
tidur()
sleep()
Metode tidak melepaskan kunci.sleep()
adalah metodejava.lang.Thread
kelas.sleep()
adalah metode statis -public static void sleep(long millis, int nanos) throws InterruptedException { //... }
sleep()
selesai.sleep()
lebih baik tidak menelepon dari loop (yaitu lihat kode di bawah ).sleep()
dapat dipanggil dari mana saja. tidak ada persyaratan khusus.Ref: Perbedaan antara Tunggu dan Tidur
Cuplikan kode untuk metode panggilan menunggu dan tidur
sumber
Thread.sleep()
digunakan untuk membuat waktu prosesor tersedia untuk utas lainnya. periode tidur dapat diakhiri dengan interupsi (yaitu dengan JVM). Baca ini stackoverflow.com/questions/4264355/…notify()
ataunotifyAll()
yangObject
metode kelas. maka mereka tersedia akan keberatan dari semua kelas (yaitu di sini denganThread
kelas juga). lihat kode grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…Ada beberapa perbedaan catatan kunci yang saya simpulkan setelah mengerjakan wait and sleep, pertama-tama lihat sampel menggunakan wait () dan sleep ():
Contoh1 : menggunakan wait () dan sleep ():
Biarkan kejelasan beberapa catatan utama:
Harap perbaiki saya jika saya salah.
sumber
Perbedaan antara menunggu () dan tidur ()
Perbedaan mendasar
wait()
adalah dariObject
dansleep()
merupakan metode statisThread
.Perbedaan utama adalah bahwa
wait()
melepaskan kunci sementarasleep()
tidak melepaskan kunci apa pun saat menunggu.wait()
digunakan untuk komunikasi antar utas sementarasleep()
digunakan untuk memperkenalkan jeda pada eksekusi, secara umum.wait()
harus dipanggil dari dalam sinkronisasi atau kita mendapatkanIllegalMonitorStateException
, sementarasleep()
dapat dipanggil di mana saja.wait()
, Anda harus meneleponnotify()
ataunotifyAll()
. Adapunsleep(),
utas memulai setelah interval waktu yang ditentukan.Kesamaan
sumber
Ini adalah pertanyaan yang sangat sederhana, karena kedua metode ini memiliki kegunaan yang sama sekali berbeda.
Perbedaan utama adalah menunggu untuk melepaskan kunci atau monitor saat tidur tidak melepaskan kunci atau monitor saat menunggu. Tunggu digunakan untuk komunikasi antar utas sementara tidur digunakan untuk memperkenalkan jeda saat eksekusi.
Ini hanya penjelasan yang jelas dan mendasar, jika Anda menginginkan lebih dari itu maka lanjutkan membaca.
Seandainya
wait()
metode thread masuk dalam status menunggu dan tidak akan kembali secara otomatis sampai kami memanggilnotify()
metode (ataunotifyAll()
jika Anda memiliki lebih dari satu utas dalam status menunggu dan Anda ingin membangunkan semua utas itu). Dan Anda perlu disinkronkan atau objek atau kunci kelas untuk akseswait()
ataunotify()
ataunotifyAll()
metode. Dan satu hal lagi, yaituwait()
metode ini digunakan untuk komunikasi antar-thread karena jika sebuah thread masuk dalam keadaan menunggu Anda akan membutuhkan utas lain untuk membangunkan utas itu.Tetapi dalam hal
sleep()
ini adalah metode yang digunakan untuk menahan proses selama beberapa detik atau waktu yang Anda inginkan. Karena Anda tidak perlu memprovokasi metodenotify()
atau apa punnotifyAll()
untuk mendapatkan utas itu kembali. Atau Anda tidak perlu utas lainnya untuk menelepon utas itu. Seperti jika Anda menginginkan sesuatu akan terjadi setelah beberapa detik seperti dalam permainan setelah giliran pengguna, Anda ingin pengguna menunggu hingga komputer diputar maka Anda dapat menyebutkansleep()
metodenya.Dan satu lagi perbedaan penting yang sering ditanyakan dalam wawancara:
sleep()
milikThread
kelas danwait()
milikObject
kelas.Ini semua perbedaan antara
sleep()
danwait()
.Dan ada kesamaan antara kedua metode: keduanya diperiksa pernyataan sehingga Anda perlu mencoba menangkap atau melempar untuk mengakses metode ini.
Saya harap ini akan membantu Anda.
sumber
sumber: http://www.jguru.com/faq/view.jsp?EID=47127
sumber
Tunggu dan tidur adalah dua hal berbeda:
sleep()
utas berhenti bekerja untuk durasi yang ditentukan.wait()
utas berhenti bekerja sampai objek yang menunggu diberitahukan, umumnya oleh utas lainnya.sumber
sleep
, jika Anda ingin utas berhenti sampai beberapa masukan datang dari yang lain Anda gunakanwait
/notify
.interrupt
dimaksudkan sebagai cara untuk memberi tanda utas bahwa ia harus berhenti melakukan apa yang dilakukannya dan mengakhiri. Ini ditangani olehsleep
,wait
tetapi juga memblokir fungsi I / O (dan Anda bisa mengimplementasikan fungsi dengan perilaku yang sama dengan memanggil metodeThread.interrupted()
). Adapun kinerja, fungsi biasanya dioptimalkan untuk tujuan yang dirancang.sleep
adalah metodeThread
,wait
adalah metodeObject
, jadiwait/notify
adalah teknik sinkronisasi data bersama di Jawa (menggunakan monitor ), tetapisleep
merupakan metode sederhana utas untuk menjeda sendiri.sumber
sleep () adalah metode yang digunakan untuk menahan proses selama beberapa detik atau waktu yang Anda inginkan tetapi dalam kasus menunggu () utas metode berjalan dalam keadaan menunggu dan tidak akan kembali secara otomatis sampai kami memanggil pemberitahuan () atau beri tahuAll ().
Perbedaan utama adalah bahwa wait () melepaskan kunci atau monitor saat tidur () tidak melepaskan kunci atau monitor apa pun saat menunggu. Tunggu digunakan untuk komunikasi antar utas sementara tidur digunakan untuk memperkenalkan jeda saat eksekusi, secara umum.
Thread.sleep () mengirimkan utas saat ini ke status "Tidak Dapat Dijalankan" untuk beberapa waktu. Utas menjaga monitor yang telah diperolehnya - yaitu jika utas saat ini berada dalam blok atau metode yang disinkronkan, tidak ada utas lain yang bisa memasuki blok atau metode ini. Jika utas lain memanggil t.interrupt () ia akan mengaktifkan utas tidur. Perhatikan bahwa tidur adalah metode statis, yang berarti selalu mempengaruhi utas saat ini (salah satu yang menjalankan metode tidur). Kesalahan umum adalah memanggil t.sleep () di mana t adalah utas yang berbeda; meskipun begitu, itu adalah utas saat ini yang akan tidur, bukan utas.
object.wait () mengirimkan utas saat ini ke status "Tidak Dapat Dijalankan", seperti sleep (), tetapi dengan twist. Tunggu dipanggil pada objek, bukan utas; kami menyebut objek ini sebagai "objek kunci." Sebelum lock.wait () dipanggil, utas saat ini harus disinkronkan pada objek kunci; tunggu () kemudian lepaskan kunci ini, dan tambahkan utas ke "daftar tunggu" yang terkait dengan kunci tersebut. Kemudian, utas lain dapat disinkronkan pada objek kunci yang sama dan panggil kunci. Notify (). Ini membangunkan utas menunggu asli. Pada dasarnya, tunggu () / beri tahu () seperti sleep () / interrupt (), hanya utas aktif tidak perlu penunjuk langsung ke utas tidur, tetapi hanya ke objek kunci bersama.
Biarkan kategorikan semua poin di atas:
Call on:
Synchronized:
Hold lock:
Wake-up condition:
Usage:
Ref: diff
sleep
danwait
sumber
Dengan kata sederhana, tunggu adalah menunggu. Sampai beberapa utas lain memanggil Anda, sedangkan tidur adalah "jangan jalankan pernyataan berikutnya" untuk jangka waktu tertentu.
Selain itu tidur adalah metode statis di kelas Thread dan beroperasi di thread, sedangkan wait () ada di kelas Object dan memanggil objek.
Poin lain, ketika Anda memanggil tunggu di beberapa objek, utas yang terlibat menyinkronkan objek dan kemudian menunggu. :)
sumber
wait
dansleep
metodenya sangat berbeda:sleep
tidak memiliki cara "bangun",wait
memiliki cara "bangun" selama periode menunggu, dengan panggilan thread lainnotify
ataunotifyAll
.Kalau dipikir-pikir, nama-nama itu membingungkan dalam hal itu; Namun
sleep
adalah nama standar danwait
sepertiWaitForSingleObject
atauWaitForMultipleObjects
di Win API.sumber
Dari pos ini: http://javaconceptoftheday.com/difference-between-wait-and-sleep-methods-in-java/
tunggu () Metode.
1) Utas yang memanggil metode tunggu () melepaskan kunci yang dipegangnya.
2) Utas mendapatkan kembali kunci setelah utas lainnya memanggil metode notify () atau notifyAll () pada kunci yang sama.
3) metode wait () harus dipanggil dalam blok yang disinkronkan.
4) metode menunggu () selalu dipanggil pada objek.
5) Utas tunggu dapat dibangunkan oleh utas lain dengan memanggil metode notify () atau notifyAll ().
6) Untuk memanggil metode wait (), utas harus memiliki kunci objek.
sleep () Metode
1) Thread yang memanggil metode sleep () tidak melepaskan kunci yang dipegangnya.
2) metode sleep () dapat dipanggil di dalam atau di luar blok yang disinkronkan.
3) metode sleep () selalu dipanggil utas.
4) Thread tidur tidak dapat dibangunkan oleh utas lainnya. Jika demikian, utas akan melempar InterruptedException.
5) Untuk memanggil metode sleep (), utas tidak perlu memiliki kunci objek.
sumber
Sini tunggu () akan berada dalam status menunggu sampai diberitahukan oleh Utas lain tetapi ketika sleep () akan memiliki waktu .. setelah itu akan secara otomatis ditransfer ke status Siap ...
sumber
wait()
adalah metodeObject
kelas.sleep()
adalah metodeThread
kelas.sleep()
memungkinkan utas masuk kesleep
status selama x milidetik.Saat utas masuk ke kondisi tidur
it doesn’t release the lock
.wait()
memungkinkan utas untuk melepaskan kunci dangoes to suspended state
.Utas ini akan aktif ketika a
notify()
ataunotifAll()
metode dipanggil untuk objek yang sama.sumber
Satu perbedaan besar potensial antara tidur / menyela dan menunggu / memberi tahu adalah bahwa
interrupt()
selamasleep()
selalu melempar pengecualian (mis. InterruptedException ), sedangkannotify()
selamawait()
tidak.Menghasilkan pengecualian saat tidak diperlukan tidak efisien. Jika Anda memiliki utas berkomunikasi satu sama lain dengan kecepatan tinggi, maka itu akan menghasilkan banyak pengecualian jika Anda menelepon interupsi sepanjang waktu, yang merupakan pemborosan total CPU.
sumber
Anda benar - Sleep () menyebabkan utas itu "tertidur" dan CPU akan padam dan memproses utas lainnya (atau dikenal sebagai pengalihan konteks) sementara saya percaya Tunggu, teruskan CPU memproses utas saat ini.
Kami memiliki keduanya karena walaupun tampaknya masuk akal untuk membiarkan orang lain menggunakan CPU saat Anda tidak menggunakannya, sebenarnya ada overhead untuk pengalihan konteks - tergantung pada berapa lama waktu tidur, itu bisa lebih mahal dalam siklus CPU untuk mengganti utas daripada hanya membuat utas Anda tidak melakukan apa-apa selama beberapa ms.
Juga perhatikan bahwa tidur memaksa saklar konteks.
Juga - secara umum tidak mungkin untuk mengontrol peralihan konteks - selama Tunggu, OS dapat (dan akan menunggu lebih lama) memilih untuk memproses utas lainnya.
sumber
interrupt
. Waktu berakhir adalahn
diwait(n)
. ¶¶ Sudah 8 tahun sekarang dan masih belum ada yang menjawab!Metode ini digunakan untuk hal-hal yang berbeda.
Thread.sleep (n) dapat diinterupsi, tetapi Object.wait () harus diberi tahu. Dimungkinkan untuk menentukan waktu maksimum untuk menunggu:
Object.wait(5000)
jadi mungkin akan digunakanwait
untuk, er,sleep
tetapi kemudian Anda harus repot dengan kunci.Tak satu pun dari metode menggunakan cpu saat tidur / menunggu.
Metode diimplementasikan menggunakan kode asli, menggunakan konstruksi yang sama tetapi tidak dengan cara yang sama.
Cari sendiri: Apakah kode sumber metode asli tersedia? File
/src/share/vm/prims/jvm.cpp
adalah titik awal ...sumber
Thread.sleep(big_num)
harus disela.Object.wait(small_num)
dapat diberitahukan.Tunggu () dan tidur () Perbedaan?
Thread.sleep () Setelah pekerjaan selesai maka hanya lepaskan kunci untuk semua orang. sampai tidak pernah melepaskan kunci ke siapa pun.
Object.wait () Ketika akan menunggu tahap, itu akan melepaskan kunci dan menunggu beberapa detik berdasarkan parameter.
Sebagai contoh:
Anda mengambil kopi di tangan kanan Anda, Anda dapat mengambil orang lain dari tangan yang sama, kapan Anda meletakkannya kemudian hanya mengambil objek lain jenis yang sama di sini. juga. ini adalah sleep () Anda waktu tidur Anda tidak bekerja, Anda hanya melakukan tidur .. sama di sini juga.
Tunggu(). ketika Anda diletakkan dan mengambil satu lagi berarti ketika Anda sedang menunggu, itu menunggu
Anda sedang memutar film atau apapun dalam sistem Anda sama dengan pemain Anda tidak dapat bermain lebih dari satu pada waktu yang tepat, itu ada di sini, ketika Anda menutup dan memilih film atau lagu siapa pun yang lain sementara disebut tunggu
sumber
wait
melepaskan kunci dansleep
tidak. Utas dalam keadaan menunggu memenuhi syarat untuk bangun segeranotify
ataunotifyAll
dipanggil. Tetapi seandainyasleep
utas menjaga kunci dan hanya akan memenuhi syarat setelah waktu tidur selesai.sumber
InterruptedException
terlempar, seperti yang tertulis di Javadoc.sleep()
Metode menyebabkan utas saat ini untuk beralih dari status berjalan ke status blok selama waktu tertentu. Jika utas saat ini memiliki kunci dari objek apa pun maka terus menahannya, yang berarti bahwa utas lain tidak dapat menjalankan metode yang disinkronkan dalam objek kelas itu.wait()
metode menyebabkan utas saat ini masuk ke status blok baik untuk waktu yang ditentukan atau sampai memberitahukan, tetapi dalam kasus ini utas melepaskan kunci objek (yang berarti bahwa utas lain dapat menjalankan metode yang disinkronkan dari objek panggilan.sumber
Menurut pendapat saya, perbedaan utama antara kedua mekanisme adalah bahwa sleep / interrupt adalah cara paling dasar untuk menangani thread, sedangkan wait / notify adalah abstraksi yang bertujuan untuk melakukan inter-komunikasi thread dengan lebih mudah.Ini berarti bahwa tidur / menyela dapat melakukan apa saja, tetapi tugas khusus ini lebih sulit untuk dilakukan.
Mengapa menunggu / memberi tahu lebih cocok? Berikut ini beberapa pertimbangan pribadi:
Ini menegakkan sentralisasi. Hal ini memungkinkan untuk mengoordinasikan komunikasi antara sekelompok utas dengan satu objek bersama. Ini menyederhanakan banyak pekerjaan.
Ini menegakkan sinkronisasi. Karena itu membuat pemrogram membungkus panggilan untuk menunggu / memberi tahu di blok yang disinkronkan.
Tidak tergantung pada asal dan nomor utas. Dengan pendekatan ini Anda dapat menambahkan lebih banyak utas secara sewenang-wenang tanpa mengedit utas lainnya atau melacak yang sudah ada. Jika Anda menggunakan sleep / interrupt, pertama Anda perlu menyimpan referensi ke thread tidur, dan kemudian menginterupsi mereka satu per satu, dengan tangan.
Contoh dari kehidupan nyata yang baik untuk dijelaskan ini adalah restoran klasik dan metode yang digunakan personel untuk berkomunikasi di antara mereka: Para pelayan meninggalkan permintaan pelanggan di tempat sentral (papan gabus, meja, dll.), membunyikan bel, dan para pekerja dari dapur datang untuk menerima permintaan seperti itu. Setelah ada kursus yang siap, petugas dapur membunyikan bel lagi sehingga para pelayan sadar dan membawa mereka ke pelanggan.
sumber
Contoh tentang tidur tidak melepaskan kunci dan menunggu tidak
Di sini ada dua kelas:
Singleton : Ini adalah kelas singleton dengan dua metode statis getInstance () dan getInstance (boolean isWait).
dan
Sekarang jalankan contoh ini Anda akan mendapatkan output di bawah ini:
Di sini contoh Singleton yang dibuat oleh threadA dan threadB sama. Itu berarti threadB sedang menunggu di luar sampai threadA melepaskan kunci itu.
Sekarang ganti Singleton.java dengan berkomentar Thread.sleep (500); metode dan uncommenting Singleton.class.wait (500); . Di sini karena Singleton.class.wait (500); metode threadA akan melepaskan semua kunci yang diperoleh dan bergerak ke status "Non Runnable", threadB akan mendapatkan perubahan untuk masuk dalam blok yang disinkronkan.
Sekarang jalankan lagi:
Di sini Singleton instance yang dibuat oleh threadA dan threadB TIDAK sama karena threadB mendapat perubahan untuk masuk dalam blok yang disinkronkan dan setelah 500 milidetik threadA mulai dari posisi terakhirnya dan membuat satu lagi objek Singleton.
sumber
Harus dipanggil dari blok yang disinkronkan:
wait()
metode selalu dipanggil dari blok yang disinkronkan, yaituwait()
metode perlu mengunci monitor objek sebelum objek yang dipanggil. Tetapisleep()
metode dapat dipanggil dari luar blok disinkronkan yaitusleep()
metode tidak memerlukan monitor objek.IllegalMonitorStateException: jika
wait()
metode dipanggil tanpa memperoleh kunci objek daripadaIllegalMonitorStateException
yang dilempar saat runtime, tetapisleep()
metode tidak pernah melempar pengecualian seperti itu.Milik kelas mana:
wait()
metode milikjava.lang.Object
kelas tetapisleep()
metode milikjava.lang.Thread
kelas.Disebut pada objek atau utas:
wait()
metode dipanggil pada objek tetapisleep()
metode dipanggil pada Utas bukan objek.Status
wait()
utas : saat metode dipanggil pada objek, utas yang memegang monitor objek beralih dari menjalankan ke status menunggu dan dapat kembali ke status dapat dijalankan hanya ketikanotify()
ataunotifyAll()
metode dipanggil pada objek tersebut. Dan kemudian penjadwal thread menjadwalkan utas untuk beralih dari dari runnable ke running state. ketikasleep()
dipanggil pada utas, ia beralih dari menjalankan ke status menunggu dan dapat kembali ke status dapat dijalankan saat waktu tidur habis.Ketika dipanggil dari blok yang disinkronkan: ketika
wait()
metode dipanggil thread meninggalkan kunci objek. Tetapisleep()
metode ketika dipanggil dari blok yang disinkronkan atau metode thread tidak meninggalkan kunci objek.Untuk Referensi Lebih Lanjut
sumber
Dari halaman dokumentasi oracle pada metode wait () dari
Object
:notify()
metode ataunotifyAll()
metode untuk objek ini. Dengan kata lain, metode ini berperilaku persis seolah-olah hanya melakukan panggilanwait(0)
.Metode ini melempar
IllegalMonitorStateException
- jika utas saat ini bukan pemilik monitor objek.InterruptedException
- jika ada utas yang mengganggu utas saat ini sebelum atau saat utas saat ini sedang menunggu pemberitahuan. Status terputus dari utas saat ini dihapus ketika pengecualian ini dilemparkan.Dari halaman dokumentasi oracle tentang metode sleep ()
Thread
:Metode ini melempar:
IllegalArgumentException
- jika nilai millis negatifInterruptedException
- jika ada utas yang mengganggu utas saat ini. Status terputus dari utas saat ini dihapus ketika pengecualian ini dilemparkan.Perbedaan utama lainnya:
wait()
adalah metode non-statis (metode instance) tidak seperti metode statissleep()
(metode kelas).sumber
wait()
diberikan di dalam metode yang disinkronkan sedangkansleep()
diberikan di dalam metode yang tidak disinkronkan karenawait()
metode melepaskan kunci pada objek tetapisleep()
atauyield()
tidak melepaskanlock()
.sumber
sleep()
bisa di dalamsynchronized
blok atau metode. Jawaban tidak menjelaskan apa pun.wait(1000)
menyebabkan utas saat ini tidur hingga satu detik .notify()
ataunotifyAll()
panggilan metode .sleep(1000)
menyebabkan utas saat ini tertidur selama tepat 1 detik .sumber
sleep(1000)
tidak menjamin untuk tidur selama tepat 1 detik. Mungkin terputus sebelumnya.Sebenarnya, semua ini dengan jelas dijelaskan dalam dokumen Java (tapi saya menyadari ini hanya setelah membaca jawabannya).
http://docs.oracle.com/javase/8/docs/api/index.html :
wait () - Utas saat ini harus memiliki monitor objek ini. Utas melepaskan kepemilikan monitor ini dan menunggu hingga utas lainnya memberi tahu utas yang menunggu monitor objek ini untuk bangun melalui panggilan ke metode notify atau metode notifyAll. Utas kemudian menunggu hingga mendapatkan kembali kepemilikan monitor dan melanjutkan eksekusi.
sleep () - Menyebabkan thread yang saat ini mengeksekusinya tertidur (menghentikan sementara eksekusi) untuk jumlah milidetik yang ditentukan, tergantung pada ketepatan dan keakuratan pengatur waktu dan penjadwal sistem. Utas tidak kehilangan kepemilikan monitor apa pun.
sumber