Rumah  >  Artikel  >  Java  >  Apakah lima keadaan benang Java

Apakah lima keadaan benang Java

WBOY
WBOYke hadapan
2023-05-27 22:35:555667semak imbas

1. Lima keadaan urutan

Dari peringkat sistem pengendalian, mana-mana urutan biasanya mempunyai lima keadaan, iaitu penciptaan, sedia, berjalan, disekat dan ditamatkan.

(1) Keadaan baharu (BARU)

Apabila menggunakan kaedah pembinaan untuk mencipta urutan baharu dalam atur cara, seperti Benang baharu(), utas berada dalam keadaan penciptaan dan ia sudah mempunyai ruang memori sepadan dan sumber lain, tetapi pelaksanaan masih belum bermula.

(2) Keadaan sedia (READ)

Memulakan benang boleh dicapai dengan memanggil kaedah mula() objek benang yang baru dibuat. Apabila benang bermula, benang memasuki keadaan sedia (boleh dijalankan)

Benang mempunyai keadaan berjalan, tetapi kerana CPU belum lagi diperuntukkan, ia memasuki baris gilir benang dan beratur untuk menunggu perkhidmatan CPU . Sebaik sahaja sistem memilih objek utas untuk dilaksanakan, objek beralih daripada keadaan menunggu kepada keadaan pelaksanaan. Tindakan yang dipilih oleh sistem dipanggil "penjadualan CPU". Apabila benang memperoleh CPU, ia memasuki keadaan berjalan dan secara automatik melaksanakan kaedah lariannya sendiri.

(3) Keadaan berjalan (RUNNING)

Benang memasuki keadaan berjalan apabila benang dalam keadaan sedia dipanggil dan menduduki sumber pemproses. Pada masa ini, kaedah run() bagi objek benang dipanggil secara automatik.

(4) Keadaan disekat (DISEKAT)

Benang pelaksana akan disekat dalam keadaan khas tertentu, seperti digantung secara buatan atau perlu melakukan operasi input dan output yang memakan masa CPU dan menangguhkan sementara pelaksanaannya sendiri, memasuki keadaan menyekat.

Jika anda menggunakan sleep(), suspend(), wait() dan kaedah lain dalam keadaan boleh laku, urutan akan disekat. Apabila disekat, benang tidak boleh memasuki baris gilir Hanya apabila punca penyekatan dihapuskan, benang memasuki keadaan sedia dan kembali ke baris gilir sedia untuk menunggu Pada masa ini, selepas dipilih oleh jadual CPU, ia akan diteruskan pelaksanaan dari kedudukan berhenti asal.

Ingat: selepas sekatan dihapuskan, ia kembali ke keadaan sedia, bukan keadaan berjalan.

(5) Keadaan kematian (DITAMATKAN)

Apabila benang memanggil stop(), musnahkan() atau run() dan menyelesaikan pelaksanaan, benang akan berada dalam keadaan terminal. Benang dalam keadaan mati tidak mempunyai keupayaan untuk terus berjalan.

2. 6 keadaan benang Java

Kitaran hayat benang di Jawa dibahagikan kepada 6 keadaan. Kelas Thread mempunyai sifat instance dan kaedah instance yang digunakan khusus untuk menyimpan dan mendapatkan keadaan thread. Antaranya, atribut instance yang digunakan untuk menyimpan keadaan instance thread ialah:

// 以整数的形式保存线程的状态
private volatile int threadStatus = 0;
// 返回当前线程的状态,一个枚举类型值
public State getState() {
    return sun.misc.VM.toThreadState(threadStatus);
}

Thread.State ialah kelas enumerasi dalaman yang mentakrifkan 6 pemalar penghitungan, mewakili 6 keadaan thread Java, seperti berikut :

public enum State {
    // 新建状态
    NEW,
    // 运行状态
    RUNNABLE,
    /**
     * 阻塞状态
     * Object.wait
     */
    BLOCKED,
    /**
     *  等待状态
     *  Object.wait
     *  Thread.join
     *  LockSupport.park
     */
    WAITING,
    /**
     *  限时等待状态
     *  Thread.sleep
     *  Object.wait
     *  Thread.join
     *  LockSupport.parkUntil
     *  LockSupport.parkNanos
     */
    TIMED_WAITING,
    // 终止状态
    TERMINATED;
}

Terdapat 4 keadaan biasa, iaitu: keadaan BARU (baharu), keadaan BOLEH RUNNABLE (boleh laku), keadaan TERMINATED (ditamatkan), keadaan TIMED_WAITING (menunggu bermasa).

(1) Keadaan BARU

Kod sumber Java menerangkan keadaan BARU seperti berikut: Kejadian benang benang yang berjaya dibuat tetapi tidak dimulakan dengan memanggil kaedah mula() berada dalam BARU negeri.

Sudah tentu, sebaik sahaja kaedah mula() contoh utas Benang dipanggil, keadaannya akan berubah daripada keadaan BARU kepada keadaan BOLEH RUNNABLE Ini tidak bermakna bahawa utas itu segera memperoleh kepingan masa CPU dan melaksanakannya serta-merta. Ia memerlukan tempoh masa di tengah-tengah operasi sistem pengendalian siri.

(2) Keadaan BOLEH RUNNABLE

Selepas memanggil kaedah mula() contoh Benang, dalam langkah seterusnya, jika benang memperoleh kepingan masa CPU dan memulakan pelaksanaan, JVM akan secara tidak segerak panggil kaedah run() thread Jalankan kod perniagaannya. Jadi apa yang JVM lakukan sebelum kaedah run() dipanggil secara tak segerak? Apabila kaedah mula() contoh Benang bagi benang Java dipanggil, benang yang sepadan dalam sistem pengendalian tidak memasuki keadaan berjalan, tetapi keadaan sedia, dan benang Java tidak mempunyai keadaan sedia ini. Apakah keadaan kesediaan benang dalam sistem pengendalian? Hubungan penukaran antara status rangkaian JVM dan status rangkaian sistem pengendalian di belakang tabir dipermudahkan seperti berikut:

Apakah lima keadaan benang Java

Jika urutan sistem pengendalian sudah sedia nyatakan, maksudnya "semuanya sudah sedia" "Saya bersedia, saya hanya berhutang dengan angin timur", iaitu benang telah memenuhi syarat pelaksanaan, tetapi tidak boleh dilaksanakan lagi. Benang dalam keadaan sedia perlu menunggu penjadualan sistem Setelah keadaan sedia dipilih oleh sistem dan memperoleh kepingan masa CPU, benang mula menduduki CPU dan mula melaksanakan kod benang keadaan sistem pengendalian benang berubah dan memasuki keadaan berjalan.

Apabila thread yang sedang berjalan dalam sistem pengendalian menggunakan kepingan masa CPU, ia akan kembali ke keadaan sedia dan menunggu penjadualan CPU seterusnya. Dengan cara ini, urutan sistem pengendalian berulang kali dijadualkan oleh sistem antara keadaan sedia dan keadaan pelaksanaan Situasi ini akan berterusan sehingga pelaksanaan logik kod benang selesai atau utas ditamatkan secara tidak normal. Pada masa ini, keadaan sistem pengendalian utas telah berubah lagi, memasuki keadaan akhir utas - keadaan TERMINATED.

Keadaan sedia dan keadaan berjalan ialah kedua-dua keadaan rangkaian dalam sistem pengendalian. Dalam bahasa Java, kedua-dua negeri ini tidak dibahagikan, tetapi digabungkan ke dalam keadaan yang sama - keadaan RUNNABLE. Oleh itu, dalam kelas penghitungan Thread.State, keadaan sedia dan keadaan berjalan bagi thread tidak ditakrifkan, hanya keadaan RUNNABLE ditakrifkan. Di sinilah keadaan benang Java berbeza daripada keadaan benang dalam sistem pengendalian.

Apabila contoh Thread berada dalam keadaan BARU, setelah kaedah start() dipanggil, thread akan beralih kepada keadaan RUNNABLE. Walaupun demikian, kaedah run() thread mungkin tidak dilaksanakan serentak dengan serta-merta.

(3) keadaan TERMINAT

Apabila thread dalam keadaan RUNNABLE selesai melaksanakan kaedah run(), ia akan memasuki keadaan penamatan TERMINATED. Sudah tentu, jika pengecualian masa jalan berlaku semasa pelaksanaan kaedah run() dan tidak ditangkap, kaedah run() akan ditamatkan secara tidak normal dan benang juga akan DITANGGALKAN.

(4) keadaan TIMED_WAITING

Urutan berada dalam keadaan menunggu khas, lebih tepatnya, utas berada dalam keadaan menunggu terhad. Operasi yang boleh meletakkan utas dalam keadaan menunggu terhad masa adalah kira-kira seperti berikut:

  • Thread.sleep(int n): menyebabkan utas semasa memasuki masa menunggu yang terhad keadaan dengan masa menunggu n milisaat.

  • Object.wait(): Preempt kunci monitor objek dengan had masa.

  • Thread.join(): Penggabungan benang terhad masa.

  • LockSupport.parkNanos(): Biarkan benang menunggu, masa dalam nanosaat.

  • LockSupport.parkUntil(): Biarkan urutan menunggu dan masa boleh ditetapkan secara fleksibel.

3. Peralihan keadaan urutan Java

Apakah lima keadaan benang Java

Atas ialah kandungan terperinci Apakah lima keadaan benang Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam