Ciclul de viață al firului în Java

Publicat: 2023-01-27

Cuprins

Elementele de bază ale firelor Java:

Un fir în Java facilitează efectuarea mai multor activități în cadrul unui singur proces. Este considerat un proces ușor. Un fir de execuție poate fi definit și ca o secvență de instrucțiuni executate. Fiecare fir în Java are propria stivă, contor de program și variabile locale. Firele Java pot fi, de asemenea, o serie imbricată de apeluri de metodă. Memoria, starea pe proces și fișierele sunt partajate de fire.

Utilizări ale thread-urilor în Java:

    • Pentru a efectua procesare în fundal sau asincronă
    • Pentru a spori sensibilitatea aplicațiilor GUI
    • Pentru a implementa laturile pozitive ale sistemelor multiprocesor
    • Pentru a eficientiza logica de programare în cazul existenței multiplelor

Există două căi de execuție atunci când este apelat un fir. Una dintre cele două căi este utilizată pentru execuția firului de execuție, iar cealaltă va urmări instrucțiunea care urmează invocarii firului de execuție. Fiecare fir în Java are un spațiu de memorie și o stivă separată.

Factorii de risc întâlniți în timpul utilizării thread-urilor în codurile Java sunt următorii.

  • Coordonarea corectă între fire este necesară în cazurile în care firele accesează variabile comune pentru a vizualiza datele în mod consecvent.
  • Performanța și întreținerea firelor, dacă sunt suprautilizate în programe, devin dificile.

Ciclul de viață al firelor în Java:

În orice moment al execuției programului, firele de execuție în Java există în oricare dintre stările menționate mai jos.

  1. Nou
  2. Blocat
  3. Rugabil
  4. Așteptare programată
  5. Aşteptare
  6. Terminat

O vedere detaliată a ciclului de viață al firului în Java

thread nou:

Firul nou creat este în starea „Nou”. Nu este progresat să ruleze în această stare. Execuția codului unui fir în noua stare încă nu are loc. Mai are de rulat.

Stare rulabilă:

Firele în stare de rulare sunt gata de rulare. Un fir de execuție în această stare poate fi gata de rulare în orice moment sau poate rula deja. Planificatorul thread-ului își îmbunătățește responsabilitatea alocării timpului pentru ca firul de execuție să ruleze. Fiecărui fir individual i se alocă un anumit timp într-un program cu mai multe fire. Fiecare fir individual rulează pentru o durată mică și apoi întâlnește o pauză. Procesorul este apoi renunțat la un alt thread pentru a oferi șansa celorlalte fire de execuție să ruleze. În acest moment, toate firele de execuție gata de rulare care așteaptă CPU-ul și firele de execuție care rulează în prezent se află într-o stare de rulare.

Consultați cursurile noastre gratuite de tehnologie pentru a obține un avantaj față de concurență.

Explorați cursurile noastre populare de inginerie software

Master în Informatică de la LJMU și IIITB Programul de certificat de securitate cibernetică Caltech CTME
Bootcamp pentru dezvoltare completă Programul PG în Blockchain
Program Executive PG în Full Stack Development
Vezi mai jos toate cursurile noastre
Cursuri de Inginerie Software

În așteptare/Stare blocată:

Un fir se află în oricare dintre stările menționate mai jos atunci când nu funcționează temporar.

  • Aşteptare
  • Blocat

Un fir care așteaptă finalizarea I/O este într-o stare blocată. Funcția planificatorului de fire este de a programa execuția unui fir blocat sau în așteptare prin reactivarea acestuia. Orice fir în această stare nu este permis pentru continuarea execuției până când nu este transformat într-o stare rulabilă. Firele din starea de blocare sau de așteptare nu folosesc niciun ciclu CPU.

Un fir este forțat să fie blocat atunci când încearcă să acceseze secțiunea protejată a unui cod care este protejată de un alt fir în prezent. Planificatorul transformă unul dintre firele de execuție care așteaptă o secțiune protejată într-o stare rulabilă atunci când secțiunea este deblocată pentru toate firele de execuție. Pe de altă parte, un fir există într-o stare de așteptare în timp ce așteaptă celălalt fir într-o anumită condiție. Firele de execuție în starea de așteptare sunt împinse într-o stare de rulare odată ce condiția specificată pentru așteptare este îndeplinită. Dacă un fir de execuție care rulează în prezent este mutat într-o stare de așteptare/blocat, planificatorul de fire de execuție programează un alt fir din secvența rulabilă.

Așteptare temporizată:

Când o metodă este invocată cu un argument time out, firul de execuție există într-o stare de așteptare temporizată. Un fir de execuție continuă să rămână în această stare până la finalizarea timpului de expirare specificat sau până la primirea unei notificări. De exemplu, un fir este mutat într-o stare de așteptare temporizată dacă invocă așteptarea sau somnul condiționat.

Stare terminată:

Încetarea thread-urilor are loc din oricare dintre următoarele motive.

  • Ieșirea normală a firului de execuție la finalizarea execuției segmentelor de cod din firul de execuție.
  • Apariția oricărui eveniment eronat rar, cum ar fi o excepție netratată și o eroare de segmentare.

Un fir de execuție în stare terminată nu consumă niciun ciclu CPU.

Învață cursuri de dezvoltare software online de la cele mai bune universități din lume. Câștigați programe Executive PG, programe avansate de certificat sau programe de master pentru a vă accelera cariera.

Abilități de dezvoltare software la cerere

Cursuri JavaScript Cursuri de bază Java Cursuri de Structuri de Date
Cursuri Node.js Cursuri SQL Cursuri de dezvoltare full stack
Cursuri NFT Cursuri DevOps Cursuri de Big Data
Cursuri React.js Cursuri de securitate cibernetică Cursuri de cloud computing
Cursuri de proiectare baze de date Cursuri Python Cursuri de criptomonede

Implementarea stărilor firelor în Java:

Pentru a realiza starea curentă a unui fir în Java, folosim metoda Thread.getState(). Java oferă, de asemenea, clasa java.lang.Thread.State în care sunt definite constantele ENUM pentru starea unui fir. Detaliile sunt rezumate în tabelul de mai jos.

Tip constant Declaraţie Descriere
Nou public static final Thread.State NOU Este starea firului de execuție a firului de execuție care tocmai a fost creat și încă trebuie să înceapă execuția acestuia.
Rugabil public static final Thread.State RUNNABLE Descrie starea unui fir care rulează deja sau a unui fir care este gata de rulare.

Același fir de execuție poate fi într-o stare rulabilă pentru mașina virtuală Java și în stare de așteptare pentru alte resurse ale sistemului de operare, cum ar fi un procesor.

Blocat public static Final Thread.State BLOCAT Descrie starea unui fir care este blocat în așteptarea blocării monitorului. Rămâne în aceeași stare până când blocul monitor intră într-o metodă/bloc sincronizat sau reintră în metoda sincronizată după invocarea Object.wait().
Aşteptare public static final Thread.State ASTEPTARE Descrie starea unui fir care așteaptă datorită invocării uneia dintre următoarele metode.

  1. Object.wait fără timeout
  2. LockSupport.park
  3. Thread.join fără timeout

Starea de așteptare poate fi din cauza finalizării unei anumite sarcini de către un alt fir.

Așteptare programată Thread final static public.Stare TIMED_WAITING Este o stare a firului care așteaptă un timp specificat. Invocarea oricăreia dintre următoarele metode are ca rezultat o stare de așteptare temporizată a unui fir cu un timp de așteptare pozitiv alocat.

  1. Thread.join cu timeout
  2. Object.wait cu timeout
  3. LockSupport.partUntil
  4. LockSupport.parkNanos
Terminat public static final Thread.State TERMINAT Este starea unui fir de execuție care a finalizat executarea instrucțiunilor de cod constitutiv.

Firul se află într-o stare NOUĂ când tocmai este creat. Când metoda .start() este invocată pe un fir de execuție, aceasta este mutată într-o stare Runnable de către planificatorul de fire. Când metoda join() este invocată pe o instanță de fir, firul de execuție care execută instrucțiunea de cod în prezent va aștepta ca acest fir să se termine. Deci, înainte de tipărirea instrucțiunii finale pe consolă, funcția join() este invocată pe firul 2 de către program și menține firul 1 în așteptare până când thread-ul 2 își încheie execuția și se mută în starea terminată. Deoarece thread1 așteaptă finalizarea execuției thread2, este pus în starea AȘTEPTARE.

Citiți articolele noastre populare legate de dezvoltarea software

Cum se implementează abstracția datelor în Java? Ce este Inner Class în Java? Identificatori Java: definiție, sintaxă și exemple
Înțelegerea încapsulării în OOPS cu exemple Argumentele liniei de comandă în C explicate Top 10 caracteristici și caracteristici ale cloud computing-ului în 2022
Polimorfismul în Java: concepte, tipuri, caracteristici și exemple Pachete în Java și cum să le folosiți? Tutorial Git pentru începători: Învață Git de la zero

Meritele și limitările utilizării thread-urilor în programele Java:

Utilizarea thread-urilor în programele Java are următoarele beneficii.

  • Reducerea timpului necesar dezvoltării codului
  • Costuri de întreținere reduse
  • Performanță îmbunătățită a aplicațiilor complexe
  • Creșterea responsibilității interfețelor utilizator
  • Paralelizarea sarcinilor
  • Threadurile sunt folosite în aplicațiile server pentru a îmbunătăți debitul ridicat și utilizarea resurselor.
  • Dacă toate resursele de calcul ale CPU nu pot fi utilizate de un fir de execuție, rularea unui alt fir de execuție le va menține angajate.
  • Dacă același set de date este operat de mai multe fire de execuție, memoria cache a acestora poate fi partajată. Acest lucru duce la o mai bună utilizare a memoriei cache sau la armonizarea valorilor sale.

Există mai multe dezavantaje ale utilizării thread-urilor în programele Java. Unele dintre ele sunt enumerate mai jos.

  • În timp ce partajați cache-uri, TLB-uri sau orice alte resurse hardware, mai multe fire de execuție pot interfera între ele.
  • Chiar și atunci când funcționează doar un singur thread, timpul de execuție al unui thread nu poate fi îmbunătățit. Totuși, este permisă degradarea timpului de execuție. Acest lucru se poate datora etapelor suplimentare de conductă și/sau frecvențe mai lente care sunt necesare pentru acomodarea hardware-ului de comutare a firelor.
  • Sunt necesare numeroase modificări atât în ​​sistemele de operare, cât și în programele de aplicație, în comparație cu multiprocesarea, deoarece suportul hardware este mai expus software-ului în multithreading.

Dacă sunteți interesat să aflați mai multe despre Java, dezvoltarea de software full-stack, consultați programul Executive PG în dezvoltare software de la upGrad și IIIT-B – Specializare în dezvoltare full-stack, care este conceput pentru profesioniști care lucrează și oferă peste 500 de ore de formare riguroasă. , peste 9 proiecte și sarcini, statutul de absolvenți IIIT-B, proiecte practice practice și asistență pentru locuri de muncă cu firme de top.

Vrei să distribui acest articol?

Pregătiți-vă pentru o carieră a viitorului

Aplicați acum pentru masterat în inginerie software