Siklus hidup utas dan status utas - 1

"Hai, Amigo!"

"Kita akan memulai topik baru: utas."

"Mari kita mulai. Hari ini kita akan memeriksa status yang dilewati objek Thread (atau mungkin melewati) saat thread sedang berjalan."

"Berapa banyak negara bagian yang bisa kamu sebutkan sekarang, Amigo?"

"Dua. Yang pertama adalah utas sebelum metode start() dipanggil: objeknya ada, tetapi utasnya belum aktif. Dan yang kedua adalah setelah metode start() dipanggil: saat utas melakukan sesuatu penting."

"Kamu benar—ada perbedaan seperti itu. Status ini disebut new dan running , tapi itu baru permulaan."

"Pertama, pada titik tertentu utas akan selesai berjalan, yang berarti mungkin ada situasi di mana objek Utas ada, tetapi utas tidak dalam keadaan baru atau berjalan. "Keadaan ini, di mana utas telah selesai berjalan, disebut diakhiri ."

"Tapi masih ada lagi. Jangan lupa bahwa pada waktu tertentu hanya satu utas yang benar-benar berjalan. Apa yang tampak sebagai pekerjaan simultan sebenarnya adalah prosesor yang terus-menerus melompat dari utas ke utas. Ada status terpisah saat utas tampaknya berjalan, tetapi sebenarnya menunggu giliran: ini disebut ready-to-run . Saat utas berfungsi, utas terus-menerus beralih dari running ke ready , dan kemudian kembali berjalan saat menjadi aktif kembali."

"Segera setelah metode start () dipanggil, utas diberi status siap dijalankan dan ditempatkan dalam daftar utas bersama yang dialihkan oleh JVM."

"Itu tidak terlalu sulit. Sebelum mulai berjalan, ia memiliki status baru . Setelah selesai, diakhiri . Saat dijalankan, utas dalam kondisi berjalan ; lalu saat menunggu, dalam kondisi siap ."

"Kesingkatanmu luar biasa, tapi kamu benar."

"Tapi masih ada lagi. Utas dapat diblokir. Misalnya, ketika Anda memasukkan blok yang disinkronkan . Jika utas sampai ke blok kode yang ditandai sebagai disinkronkan dan utas lain menggunakannya, maka utas kami akan memasuki keadaan diblokir dan akan menunggu agar mutex (kunci) objek dilepaskan."

"Beginilah tampilan situasi dengan negara bagian ini:"

Siklus hidup utas dan status utas - 2

"Tapi masih ada lagi. Ada juga keadaan terpisah yang disebut waiting . Ini adalah saat utas tidak diblokir , tetapi juga belum siap . Misalnya, saat Anda memanggil metode gabung () di utas lain."

Saat kita memanggil join() pada objek Utas lain, seolah-olah utas kita "bergabung", tetapi kenyataannya hanya menunggu utas lainnya selesai.

"Selain itu, ada juga metode wait () (dari trio metode wait/notify/notifyAll), yang mengalihkan utas ke status menunggu saat dipanggil."

"Wah."

"Tunggu sebentar! Masih ada lagi. Utas bisa tidur dengan memanggil metode tidur, misalnya. Ada juga keadaan terpisah untuk ini. Ini disebut « waktunya menunggu ». « waktunya menunggu » berarti utas sedang menunggu sesuatu untuk waktu terbatas. Jika Anda memanggil metode tunggu dengan parameter, seperti tunggu(batas waktu) atau gabung(batas waktu), maka utas akan memasuki status waktu tunggu."

"Ini diagram lengkapnya:"

Siklus hidup utas dan status utas - 3

"Hmm. Itu saja? Atau ada 10 negara lagi yang menarik?"

"Untuk saat ini, itu saja."

"Dalam praktiknya, Anda cukup mengingat diagram pertama. Lebih sederhana. Tapi yang kedua lebih akurat."

"Anehnya, ada banyak diagram status Thread di Internet, dan semuanya berbeda."

"Itulah mengapa saya memberi Anda diagram ini — ini yang paling lengkap dan benar."

"Dalam diagram ini, status ready dan running digabungkan dalam satu blok yang disebut runnable. Tahukah kamu kenapa?"

"Tidak. Ini pertama kalinya aku melihat yang seperti itu."

" Kelas Thread memiliki kelas dalam bernama State , serta metode State getState() publik ."

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

"Anda selalu dapat memanggil metode getState () pada objek Thread , dan mengetahui statusnya saat ini. Dan, tentu saja, itu akan menjadi salah satu nilai enum Status."

"Begitu. Jadi, status sebenarnya ada di dalam JVM, tetapi ada juga status yang bisa Anda akses melalui kode Java menggunakan metode State getState()."

"Dan dalam keadaan apa saya akan menggunakan itu?"

"Kemungkinan besar, tidak pernah."

"Tapi Anda harus tahu apa yang terjadi di dalam utas. Kalau tidak, Anda akan memiliki banyak bug, dan Anda bahkan tidak akan bisa menebak apa penyebabnya."

"Ditambah lagi, pemberi kerja suka bertanya tentang status Thread selama wawancara."