"Hai, Amigo!"

"Sekarang saya akan memberitahu anda sedikit tentang kaedah tidur, hasil dan gabungan."

"Itu membosankan. Saya baru sahaja menemui soalan temu bual: 'Apakah perbezaan antara kaedah hasil (), tidur (), dan tunggu ()?'. Bolehkah anda menjelaskannya?"

"Tiada masalah. Mula-mula, ini adalah tiga kaedah yang sama sekali berbeza."

1) tidur(masa tamat)  – menghentikan benang semasa (yang tidur dipanggil) untuk bilangan milisaat yang ditunjukkan oleh parameter tamat masa. Urutan kemudian masuk ke keadaan TIMED_WAITING. Kaedah ini mungkin berakhir lebih awal jika bendera isInterrupted ditetapkan.

Contoh Penerangan
Thread.sleep(500);
Urutan semasa menggantung pelaksanaannya sendiri selama 500 milisaat, atau 0.5 saat.

2) yield()  – benang semasa 'melangkau gilirannya'. Benang pergi dari keadaan berjalan ke keadaan sedia , dan JVM meneruskan ke urutan seterusnya. Keadaan berjalan dan sedia adalah sub-keadaan bagi keadaan RUNNABLE .

Contoh Penerangan
Thread.yield();
Benang semasa "melangkau gilirannya" dan Java segera beralih ke urutan seterusnya.

3) tunggu(masa tamat)  - ini adalah versi kaedah tunggu (), tetapi dengan tamat masa. " Kaedah tunggu hanya boleh dipanggil dalam blok yang disegerakkan pada objek mutex yang dikunci oleh benang semasa. Jika tidak, kaedah itu membuang Pengecualian MonitorState Haram .

"Memanggil kaedah ini menyebabkan kunci objek mutex dilepaskan, menjadikannya tersedia untuk benang lain diperoleh. Selain itu, benang memasuki keadaan MENUNGGU (untuk kaedah menunggu() tanpa parameter) atau keadaan TIMED_WAITING (untuk menunggu(masa tamat masa). ) kaedah)."

Contoh Penerangan
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Apabila kaedah tunggu dipanggil, benang semasa melepaskan kunci objek monitor dan tidur selama 500 milisaat. Objek monitor boleh diperolehi oleh benang lain.
Selepas 500 milisaat, benang akan bangun dan jika monitor tidak sibuk, benang akan memperolehnya dan terus berfungsi.
Jika monitor dikunci oleh benang lain, benang semasa akan bertukar kepada keadaan DISEKAT.

4) sertai (masa tamat)

"Kaedah ini tiada dalam soalan anda, tetapi ia ada dalam rancangan pelajaran saya, jadi saya akan memberitahu anda mengenainya. Apabila anda memanggil kaedah join() atau join(timeout), thread semasa 'disambungkan' pada Thread yang memanggil kaedah ini. Benang semasa tidur dan menunggu sehingga benang yang dicantumkan selesai (iaitu benang yang kaedah cantum() dipanggil)."

"Benang semasa memasuki keadaan WAITING untuk kaedah join() dan keadaan TIMED_WAITING untuk kaedah join(timeout)."

Contoh Penerangan
Thread thread = getWorkThread();
thread.join(500);
Urutan semasa akan menyertai utas workerThread dan menunggu sehingga ia tamat.
Tetapi ia akan 'menyahcantumkan' selepas 500 milisaat dan terus berjalan.

"Tamat masa dalam kaedah tunggu(masa tamat) dan sertai(masa tamat) bermakna kaedah itu tidur dan menunggu sesuatu, tetapi tidak lebih daripada tamat masa yang diberikan dalam milisaat. Kemudian ia bangun."

"Nampaknya satu-satunya persamaan kaedah ini ialah tamat masa. Mereka melakukan perkara yang sama sekali berbeza."

"Ya, betul."