Kitaran hayat benang dan keadaan benang - 1

"Hai, Amigo!"

"Kami akan memulakan topik baharu: benang."

"Mari kita mulakan. Hari ini kita akan memeriksa keadaan yang dilalui oleh objek Thread (atau mungkin dilalui) apabila thread sedang berjalan."

"Berapa negeri yang boleh awak namakan sekarang, Amigo?"

"Dua. Yang pertama ialah benang sebelum kaedah mula() dipanggil: objek wujud, tetapi utas itu belum aktif lagi. Dan yang kedua ialah selepas kaedah mula() dipanggil: apabila benang melakukan sesuatu penting."

"Anda betul—terdapat perbezaan sedemikian. Negeri ini dipanggil baharu dan berjalan , tetapi itu hanya permulaan."

"Pertama, pada satu ketika benang akan selesai berjalan, yang bermaksud mungkin terdapat situasi di mana objek Thread wujud, tetapi benang tidak berada dalam keadaan baharu atau berjalan. "Keadaan ini, di mana benang telah selesai berjalan, dipanggil ditamatkan perkhidmatan ."

"Tetapi ada lagi. Jangan lupa bahawa pada bila-bila masa hanya satu utas yang benar-benar berjalan. Apa yang kelihatan sebagai kerja serentak sebenarnya adalah pemproses sentiasa melompat dari benang ke benang. Terdapat keadaan yang berasingan apabila benang itu kelihatan seperti sedang berjalan, tetapi sebenarnya sedang menunggu gilirannya: ia dipanggil sedia untuk dijalankan . Apabila benang berfungsi, ia sentiasa bertukar daripada berlari kepada bersedia , dan kemudian kembali kepada berjalan apabila ia menjadi aktif semula."

"Sejurus selepas kaedah mula () dipanggil, utas diberikan status sedia untuk dijalankan dan diletakkan dalam senarai perkongsian urutan yang JVM bertukar antara."

"Itu tidak terlalu sukar. Sebelum ia mula berjalan, ia mempunyai keadaan baru . Selepas ia selesai, ia ditamatkan . Apabila ia berjalan, benang berada dalam keadaan berjalan ; kemudian apabila ia menunggu, ia dalam keadaan sedia . ."

"Pendek kata awak sangat mengagumkan, tetapi awak betul."

"Tetapi ada lagi. Benang boleh disekat. Contohnya, apabila anda memasuki blok yang disegerakkan . Jika benang sampai ke blok kod yang ditandakan sebagai disegerakkan dan benang lain menggunakannya, maka benang kita akan memasuki keadaan disekat dan akan menunggu untuk mutex (kunci) objek dilepaskan."

"Begini rupa keadaan dengan negeri ini:"

Kitaran hayat benang dan keadaan benang - 2

"Tetapi lebih banyak lagi. Terdapat juga keadaan berasingan yang dipanggil menunggu . Ini adalah apabila urutan tidak disekat , tetapi juga tidak bersedia . Contohnya, apabila anda memanggil kaedah gabungan () pada urutan lain."

Apabila kita memanggil join() pada objek Thread yang lain, ia seolah-olah benang kita «bercantum» dengannya, tetapi pada hakikatnya ia hanya menunggu untuk thread lain selesai.

"Selain itu, terdapat juga kaedah tunggu () (daripada kaedah tunggu/beritahu/beritahuSemua trio), yang menukar urutan ke keadaan menunggu apabila ia dipanggil."

"Wah."

"Tunggu sebentar! Masih ada lagi. Utas boleh tidur dengan memanggil kaedah tidur, sebagai contoh. Terdapat juga keadaan yang berasingan untuk ini. Ia dipanggil « menunggu masa ». « menunggu masa » bermakna benang sedang menunggu sesuatu untuk masa yang terhad. Jika anda memanggil kaedah tunggu dengan parameter, seperti tunggu(masa tamat) atau sertai(masa tamat), maka urutan akan memasuki keadaan menunggu masa."

"Ini gambar rajah penuh:"

Kitaran hayat benang dan keadaan benang - 3

"Hmm. Itu sahaja? Atau ada 10 lagi negeri yang menarik?"

"Buat masa ini, itu sahaja."

"Dalam amalan, anda hanya boleh mengingati rajah pertama. Ia lebih mudah. ​​Tetapi yang kedua lebih tepat."

"Anehnya, terdapat banyak gambar rajah keadaan Thread di Internet, dan semuanya berbeza."

"Itulah sebabnya saya memberikan anda rajah ini—ia adalah yang paling lengkap dan betul."

"Dalam rajah ini, keadaan sedia dan berjalan digabungkan dalam satu blok yang dipanggil runnable. Adakah anda tahu mengapa?"

"Tidak. Ini kali pertama saya melihat sesuatu seperti itu."

" Kelas Thread mempunyai kelas dalaman yang dipanggil State , serta kaedah getState() State awam ."

Contoh
public enum State
{
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}

"Anda sentiasa boleh memanggil kaedah getState () pada objek Thread dan mengetahui keadaan semasanya. Dan, sudah tentu, ia akan menjadi salah satu nilai enum Negeri."

"Saya faham. Jadi, keadaan sebenar berada di dalam JVM, tetapi terdapat juga keadaan yang anda boleh akses melalui kod Java menggunakan kaedah getState() Negeri."

"Dan dalam keadaan apakah saya akan menggunakannya?"

"Kemungkinan besar, tidak pernah."

"Tetapi anda perlu tahu apa yang berlaku di dalam benang. Jika tidak, anda akan mempunyai banyak pepijat, dan anda tidak akan dapat meneka apa yang menyebabkannya."

"Selain itu, majikan suka bertanya tentang keadaan Benang semasa temu duga."