Pertama, pertanyaan yang sangat bodoh, saya hanya bertanya-tanya apa artinya menunggu 'parkir'? Apakah utas menunggu untuk diparkir atau baru saja diparkir dan oleh karena itu dalam status menunggu? Dan ketika parkir itu terjadi, berapa banyak sumber daya cpu / memori yang diambil? Apa tujuan memarkir utas?
Kedua, dengan melihat metode park pada java thread API
Menonaktifkan utas saat ini untuk tujuan penjadwalan utas kecuali izin tersedia.
Jika izin tersedia maka izin tersebut digunakan dan panggilan langsung kembali; jika tidak, utas saat ini menjadi dinonaktifkan untuk tujuan penjadwalan utas dan tidak aktif hingga salah satu dari tiga hal terjadi .....
Bahasa Inggris bukan bahasa utama saya, jadi saya memiliki beberapa kesulitan untuk memahaminya, saya bermaksud 'izin' sebagai semacam 'izin untuk memarkir utas', jadi pertanyaan yang mengikuti:
- Apa maksudnya itu, apa itu 'izin', dan siapa serta bagaimana cara pemeriksaan izin tersebut?
- Apa artinya: 'jika ada izin, maka dikonsumsi', apakah 'diparkir'?
- berikut, jika poin kedua benar, lalu apa perbedaan antara 'parkir' dan 'tidak aktif'? Jika saya memiliki izin, saya dapat memarkirnya selamanya dan jika tidak, saya dapat membuatnya 'tidak aktif'?
Terima kasih
sumber
park()
berarti "Saya ingin menangguhkan eksekusi saya sampai beberapa thread lain memberi saya izin dengan meneleponunpark()
".Sesuai dengan dokumentasi java Thread State , thread A dapat masuk ke status WAITING karena tiga alasan:
Saat Anda memanggil metode park pada Thread, itu menonaktifkan thread untuk tujuan penjadwalan thread kecuali jika izin tersedia. Anda dapat memanggil metode unpark untuk menyediakan izin untuk utas yang diberikan, jika belum tersedia.
Jadi, ketika Thread Anda dalam mode WAITING oleh LockSupport.park, itu akan menampilkan Anda sebagai WAITING (parkir).
Harap perhatikan bahwa, Anda dapat menelepon parkir di Thread saat ini saja. Mekanisme ini sangat membantu untuk mengimplementasikan Pola Desain Produsen-Konsumen.
sumber
Dari deskripsi kelas (di bagian atas javadoc LockSupport ) di mana ia menjelaskan izin:
(Saya memperluas [teks] agar lebih mudah dibaca oleh penutur non-Inggris.)
Semoga seseorang dengan pemahaman yang lebih dalam dapat menguraikan hal ini.Lihat jawaban axtavt.Sebagai catatan terakhir, kutipan terakhir dari javadoc:
sumber
Bagian yang membuat saya memikirkan kembali pertanyaan ini yang tidak dapat saya singkirkan saat membaca dokumentasi, adalah:
Jadi, ketika izin "tersedia", siapa dan bagaimana membuatnya tersedia, sehingga bisa langsung dikonsumsi? Ini entah bagaimana sepele untuk mengetahuinya:
public static void main(String[] args) { Thread parkingThread = new Thread(() -> { System.out.println("Will go to sleep..."); sleepTwoSeconds(); System.out.println("Parking..."); // this call will return immediately since we have called LockSupport::unpark // before this method is getting called, making the permit available LockSupport.park(); System.out.println("After parking..."); }); parkingThread.start(); // hopefully this 1 second is enough for "parkingThread" to start // _before_ we call un-park sleepOneSecond(); System.out.println("Un-parking..."); // making the permit available while the thread is running and has not yet // taken this permit, thus "LockSupport.park" will return immediately LockSupport.unpark(parkingThread); } private static void sleepTwoSeconds() { try { Thread.sleep(1000 * 2); } catch (InterruptedException e) { e.printStackTrace(); } } private static void sleepOneSecond() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
Kode tersebut berbicara sendiri,
thread
sedang berjalan tetapi belum dipanggilLockSupport.park
, sementara beberapa utas lain memanggilnyaLockSupport.unpark
- sehingga membuat izin tersedia. Setelah itu kami meneleponLockSupport.park
dan itu segera kembali karena izin tersedia.Setelah Anda memikirkannya, ini agak berbahaya, jika Anda mengekspos utas Anda ke beberapa kode yang tidak Anda kontrol dan kode itu memanggil
LockSupport.unpark
saat Andapark
setelah itu - itu mungkin tidak berfungsi.sumber
Seperti yang saya pahami, "izin" hanyalah sebuah objek yang mewakili apakah sebuah Thread dapat "tidak diparkir" atau tidak. Dan ini diperiksa oleh Thread itu sendiri (atau de JRE ketika Anda mencoba untuk memarkir Thread) Hal yang "dikonsumsi", saya mengerti bahwa izin hilang dan Thread tidak dinonaktifkan.
Saya pikir Anda harus belajar lebih banyak tentang multithreading .. Anggap saja sebagai dispenser dengan Objek yang disebut "izin". Anda memberitahu Thread untuk memarkir, dan Thread memeriksa dispenser, jika ada "izin", Thread mengambilnya dan pergi (tanpa parkir). Jika tidak ada "izin" di dispenser, Thread akan diparkir sampai "izin" tersedia (dan Anda dapat memberi "izin" di dispenser dengan
unpark
.Adapun penggunaan CPU / memori, saya pikir itu tergantung dari OS, dll ...
sumber