5 peringkat: 1. Baru, iaitu benang yang baru dibuat menggunakan kaedah baharu; 2. Sedia, iaitu selepas memanggil kaedah mula() benang sedang dalam peringkat menunggu CPU untuk memperuntukkan sumber; menjadi disekat kerana beberapa sebab; 5. Kemusnahan , selepas utas menyelesaikan pelaksanaan biasa atau utas ditamatkan secara paksa terlebih dahulu atau pengecualian berlaku, utas akan dimusnahkan.
Persekitaran pengendalian tutorial ini: sistem Windows 7, komputer Dell G3.
Kitaran hayat benang terdiri daripada 5 peringkat, termasuk: baharu, sedia, berjalan, disekat dan musnah. Gambar rajah kitaran hayat yang lengkap adalah seperti berikut:
Apabila thread memasuki keadaan berjalan, sistem pengendalian umum menggunakan kaedah preemptive untuk membenarkan thread memperoleh CPU. Oleh itu, CPU perlu bertukar antara berbilang benang, jadi status benang akan bertukar antara berjalan, disekat dan sedia beberapa kali.
Baharu : Gunakan kaedah baharu, baharu keluar Thread, pada masa ini, hanya mesin maya JAVA yang memperuntukkan memori untuknya dan memulakan nilai pembolehubah ahli. Ia hanyalah objek pada masa ini.
Sedia: Ia dipanggil Selepas kaedah permulaan () utas, utas berada dalam peringkat menunggu CPU memperuntukkan sumber Sesiapa yang mengambil sumber CPU terlebih dahulu akan memulakan pelaksanaan
Benang memasuki keadaan sedia, dan maya JAVA mesin mencipta timbunan panggilan kaedah untuknya dan pembilang program. Pelaksanaan utas dikawal oleh platform asas dan mempunyai tahap rawak tertentu.
Berlari: Apabila benang sedia dijadualkan Apabila ia diperolehi Sumber CPU, ia memasuki keadaan berjalan Kaedah larian mentakrifkan operasi dan fungsi utas; (apabila utas dalam keadaan sedia memperoleh CPU, ia akan melaksanakan kaedah run()
Untuk teras tunggal. CPU (atau (teras), ia hanya boleh melaksanakan satu arahan pada masa yang sama dan JVM mencapai berbilang benang dengan cepat menukar benang untuk melaksanakan arahan. Pemproses sebenar boleh memproses satu arahan pada masa yang sama, tetapi kelajuan pensuisan ini adalah sangat pantas, dan kami tidak akan melakukannya sama sekali. Untuk memulihkan kedudukan pelaksanaan yang betul selepas penukaran thread, setiap thread mempunyai pembilang program bebas Pembilang antara setiap thread tidak menjejaskan satu sama lain dan disimpan secara berasingan.
Apabila benang mula berjalan, ia tidak boleh memegang CPU sepanjang masa (melainkan badan pelaksanaan benang sangat pendek dan pelaksanaan tamat serta-merta). Oleh itu, benang perlu diganggu semasa pelaksanaan untuk membolehkan benang lain mendapat akses kepada CPU untuk pelaksanaan. Butiran penjadualan urutan bergantung pada strategi yang digunakan oleh platform asas.
Disekat: Dalam keadaan berjalan, ia mungkin berlaku atas sebab tertentu. menjadi tersekat. Sebabnya adalah seperti berikut:
1.等待I/O流的输入输出 2.等待网络资源,即网速问题 3.调用sleep()方法,需要等sleep时间结束 4.调用wait()方法,需要调用notify()唤醒线程 5.其他线程执行join()方法,当前线程则会阻塞,需要等其他线程执行完。
Rajah penukaran status adalah seperti berikut:
Jika utas menyelesaikan pelaksanaan biasa atau utas ditamatkan secara paksa terlebih dahulu atau pengecualian berlaku, utas akan dimusnahkan dan sumber akan dikeluarkan .
1. Kaedah run()/call() dilaksanakan dan thread berakhir seperti biasa; ) kaedah untuk menamatkan benang - kaedah ini boleh menyebabkan kebuntuan dengan mudah dan secara amnya tidak disyorkan.
Pengetahuan lanjutan: potongan masa CPU Terdapat pengayun kristal pada tahap sistem pengendalian, yang sedikit seperti sami yang membunyikan loceng setiap beberapa saat. Perlanggaran berlaku sekali dalam tempoh masa yang singkat, membahagikan masa CPU kepada kepingan masa setiap benang sebenarnya terus merebut kepingan masa satu demi satu selepas kepingan masa mencapai titik, ia masih perlu merebutnya lagi ( untuk memastikan bahawa semua Thread mempunyai peluang untuk merebut CPU untuk melaksanakan logik mereka sendiri)
Keadaan baharu
Mari lihat sekeping kod berikut:
Penciptaan di sini, Ia hanya dicipta pada peringkat bahasa pengaturcaraan JAVA, tetapi pada peringkat sistem pengendalian, benang sebenar masih belum dibuat. Hanya apabila kita memanggil kaedah start() barulah benang akan dibuat dan memasuki keadaan Runnable. Hanya apabila kami memanggil kaedah start() barulah urutan itu dibuatThread t1 = new Thread();
Untuk pengetahuan yang lebih berkaitan, sila lawati lajur
Soalan LazimAtas ialah kandungan terperinci Kitaran hayat benang dibahagikan kepada beberapa peringkat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!