Rumah  >  Artikel  >  Java  >  Terdapat beberapa keadaan benang di java

Terdapat beberapa keadaan benang di java

青灯夜游
青灯夜游asal
2022-11-24 16:03:0314349semak imbas

Java mempunyai 6 keadaan urutan: awal (BARU), berjalan (BOLEH DIJALANKAN), disekat (DISEKAT), menunggu (MENUNGGU), menunggu tamat masa (TIMED_WAITING) dan ditamatkan (DITUTUP). Gunakan kata kunci baharu untuk mencipta utas baharu, tetapi kaedah mula() belum dipanggil Benang berada dalam keadaan yang disekat menunjukkan bahawa utas sedang menunggu kunci monitor dan terperangkap dalam keadaan; benang yang memasuki keadaan menunggu perlu menunggu urutan lain membuat keputusan Beberapa tindakan tertentu (pemberitahuan atau gangguan).

Terdapat beberapa keadaan benang di java

Persekitaran pengendalian tutorial ini: sistem windows7, versi java8, komputer Dell G3.

Status benang dalam Java dibahagikan kepada 6 jenis:

1. Awal (BARU): Objek urutan baharu dicipta, tetapi kaedah mula() belum dipanggil lagi.
2. RUNNABLE: Dalam benang Java, dua keadaan sedia dan berjalan biasanya dipanggil "berjalan".
Selepas objek utas dicipta, utas lain (seperti utas utama) memanggil kaedah mula() objek. Benang dalam keadaan ini terletak dalam kolam benang boleh jalan, menunggu untuk dipilih mengikut penjadualan benang untuk mendapatkan hak untuk menggunakan CPU Pada masa ini, ia berada dalam keadaan sedia. Benang dalam keadaan sedia akan berjalan selepas mendapatkan kepingan masa CPU.
3. DISEKAT: Menunjukkan bahawa benang disekat dalam kunci.
4. MENUNGGU: Urutan yang memasuki keadaan ini perlu menunggu urutan lain untuk mengambil beberapa tindakan tertentu (pemberitahuan atau gangguan).
5. Waiting tamat masa (TIMED_WAITING) : Keadaan ini berbeza daripada WAITING, ia boleh kembali dengan sendirinya selepas masa yang ditetapkan.
6. DITAMATKAN (DITAMATKAN) : Menunjukkan bahawa urutan telah selesai dilaksanakan.

6 keadaan ini ditakrifkan dalam penghitungan Negeri bagi kelas Thread Anda boleh melihat kod sumber untuk surat-menyurat satu dengan satu.

1. Rajah keadaan benang

Terdapat beberapa keadaan benang di java

2. Nyatakan penerangan terperinci

1

Melaksanakan antara muka Runnable dan mewarisi Thread boleh mendapatkan kelas thread Apabila tika baharu keluar, thread memasuki keadaan awal.

2.1. Keadaan sedia (READY of RUNNABLE)

  • Keadaan sedia hanya bermakna anda layak untuk berlari pilih anda, anda akan Sentiasa

    Bersedia.

  • Panggil kaedah mula() utas, dan utas memasuki keadaan

    Sedia.

  • Kaedah sleep() bagi utas semasa tamat, dan kaedah join() bagi utas lain tamat Selepas input pengguna selesai, utas mendapat kunci objek, dan ini benang juga akan memasuki

    SediaStatus.

  • Pisahan masa utas semasa telah digunakan, kaedah hasil() utas semasa dipanggil dan utas semasa memasuki keadaan

    Sedia.

  • Selepas benang dalam kolam kunci memperoleh kunci objek, ia memasuki keadaan

    Sedia.

2.2 Keadaan berjalan (RUNNABLE of RUNNING)

Thread apabila penjadual thread memilih thread daripada runnable pool sebagai thread semasa negeri di mana ia berada. Ini juga satu-satunya cara untuk benang memasuki keadaan berjalan.

3. Keadaan disekat (DISEKAT)

Keadaan menyekat ialah keadaan apabila benang menyekat apabila memasuki kaedah atau blok kod (memperoleh kunci) diubah suai oleh kata kunci disegerakkan.

4. Menunggu

(MENUNGGU)

Benang dalam keadaan ini tidak akan diperuntukkan masa pelaksanaan CPU Keadaan menunggu yang tidak pasti.

5. Masa menunggu tamat

(TIMED_WAITING)

Sesuatu urutan dalam keadaan ini tidak akan diperuntukkan masa pelaksanaan CPU, tetapi tidak perlu menunggu selama-lamanya untuk dikejutkan dengan jelas oleh benang lain , mereka akan bangun secara automatik selepas masa tertentu.

6. Status penamatan (TAMAT)

  • Apabila kaedah run() benang selesai, atau kaedah utama() bagi utas utama telah selesai, kami menganggapnya telah ditamatkan. Objek benang ini mungkin masih hidup, tetapi ia bukan lagi benang yang dilaksanakan secara berasingan. Sebaik sahaja benang ditamatkan, ia tidak boleh dihidupkan semula.

  • Memanggil kaedah mula() pada urutan yang ditamatkan akan membuang pengecualian java.lang.IllegalThreadStateException.

3. Beratur menunggu

    Sebelum memanggil kaedah tunggu() dan maklumkan() obj, kunci obj mesti diperolehi, iaitu, ia mesti ditulis dalam synchronized( obj) dalam segmen kod.
  • Langkah dan gambar rajah yang berkaitan dengan baris gilir menunggu

Terdapat beberapa keadaan benang di java

  • Benang 1 memperoleh kunci objek A dan menggunakan objek A .

  • Benang 1 memanggil kaedah tunggu() objek A.

  • Benang 1 melepaskan kunci objek A dan serta-merta memasuki baris gilir menunggu.

  • Objek dalam kolam kunci bersaing untuk mengunci objek A.

  • Benang 5 memperoleh kunci objek A, memasuki blok yang disegerakkan dan menggunakan objek A.

  • Thread 5 memanggil kaedah notifyAll() objek A, membangunkan semua thread dan semua thread memasuki baris gilir penyegerakan. Jika thread 5 memanggil kaedah notify() objek A, thread akan dibangkitkan Tidak diketahui siapa yang akan dibangkitkan dan thread yang dibangkitkan akan memasuki baris gilir penyegerakan.

  • Lokasi disegerakkan kaedah notifyAll() tamat dan urutan 5 melepaskan kunci objek A.

  • Benang dalam baris gilir penyegerakan bersaing untuk mengunci objek, tetapi tidak diketahui bila benang 1 boleh merebutnya.

4. Status baris gilir penyegerakan

  • Apabila urutan semasa ingin memanggil kaedah penyegerakan objek A, ia mendapati bahawa kunci objek A telah dikunci oleh benang, pada masa ini benang semasa memasuki baris gilir penyegerakan. Ringkasnya, baris gilir penyegerakan mengandungi benang yang ingin bersaing untuk kunci objek.
  • Apabila utas 1 dibangkitkan oleh utas lain 2, utas 1 memasuki baris gilir penyegerakan untuk bersaing memperebutkan kunci objek.
  • Baris Gilir Penyegerakan ialah konsep yang hanya wujud dalam persekitaran yang disegerakkan bersamaan dengan Baris Gilir Penyegerakan.
  • Selepas masa menunggu benang tamat atau dibangkitkan oleh notify/notifyAll, ia akan memasuki baris gilir penyegerakan untuk bersaing untuk kunci Jika ia memperoleh kunci, ia akan memasuki keadaan RUNNABLE, jika tidak ia akan masuk keadaan TERSEKAT dan tunggu untuk mendapatkan kunci.

5. Perbandingan beberapa kaedah

  • Thread.sleep(long millis), kaedah ini mesti dipanggil oleh thread semasa . Benang semasa memasuki keadaan TIMED_WAITING tetapi tidak melepaskan kunci objek Selepas millis, benang secara automatik bangun dan memasuki keadaan sedia. Peranan: Cara terbaik untuk memberi peluang kepada urutan lain untuk dilaksanakan.

  • Thread.yield(), kaedah ini mesti dipanggil oleh thread semasa Thread semasa menyerahkan kepingan masa CPU yang diperoleh, tetapi tidak melepaskan sumber kunci dan berubah daripada keadaan berjalan ke keadaan sedia OS memilih benang sekali lagi. Fungsi: Biarkan utas dengan keutamaan yang sama dilaksanakan secara bergilir-gilir, tetapi tidak ada jaminan bahawa ia akan dilaksanakan secara bergilir-gilir. Dalam amalan, tiada jaminan bahawa yield() akan mencapai tujuan yield, kerana yield thread mungkin dipilih semula oleh thread scheduler. Thread.yield() tidak menyebabkan penyekatan. Kaedah ini serupa dengan sleep(), kecuali pengguna tidak boleh menentukan berapa lama untuk berhenti seketika.

  • thread.join()/thread.join(long millis), thread semasa memanggil kaedah cantuman thread lain t dan thread semasa memasuki WAITING/Keadaan TIMED_WAITING , benang semasa tidak akan melepaskan kunci objek yang telah dipegang. Apabila utas t menyelesaikan pelaksanaan atau masa millis tamat, utas semasa biasanya memasuki keadaan RUNNABLE, dan mungkin juga memasuki keadaan DISEKAT (kerana gabungan dilaksanakan berdasarkan menunggu).

  • obj.wait(), benang semasa memanggil kaedah tunggu() objek, benang semasa melepaskan kunci objek dan memasuki baris gilir menunggu. Bergantung pada notify()/notifyAll() untuk bangun atau tunggu(lama masa) untuk bangun secara automatik apabila tamat masa tamat.

  • obj.notify() membangunkan satu urutan menunggu pada monitor objek ini. notifyAll() membangunkan semua benang menunggu pada monitor objek ini.

  • LockSupport.park()/LockSupport.parkNanos(long nanos),LockSupport.parkHingga(tarikh akhir yang panjang), urutan semasa memasuki keadaan MENUNGGU/TIMED_WAITING. Berbanding dengan kaedah tunggu, benang boleh memasuki keadaan WAITING/TIMED_WAITING tanpa mendapatkan kunci dan perlu dibangkitkan melalui LockSupport.unpark (Benang benang).

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Pengajaran Pengaturcaraan! !

Atas ialah kandungan terperinci Terdapat beberapa keadaan benang di java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Apakah ciri-ciri javaArtikel seterusnya:Apakah ciri-ciri java