Documente Academic
Documente Profesional
Documente Cultură
SC 3
SC 3
Numele
meu este Thread-1 Sunt Thread! Numele meu este Thread-0 Sunt Thread! Numele meu
este Thread-3 Sunt Thread! Numele meu este Thread-6 Sunt Thread! Numele meu este
Thread-7 Sunt Thread! Numele meu este Thread-4 Sunt Thread! Numele meu este Thread-
5 Sunt Thread! Numele meu este Thread-9, sunt Thread! Numele meu este Thread-8 Să
creăm 10 fire ( obiecte MyFirstThread , care moștenesc Thread ) și să le începem
apelând metoda start() pe fiecare obiect. După apelarea metodei start() , este
executată logica metodei run() . Notă: numele firelor nu sunt în ordine. Este
ciudat că nu au fost secvenţial:, Thread-1 , Thread-2 și așa mai departe? După cum
se întâmplă, acesta este un exemplu de moment în care gândirea „secvențială” nu se
potrivește. Problema este că am furnizat doar comenzi pentru a crea și a rula 10
fire. Planificatorul de fire, un mecanism special al sistemului de operare, decide
ordinea lor de execuție. Designul său precis și strategia de luare a deciziilor
sunt subiecte pentru o discuție profundă în care nu ne vom arunca acum. Principalul
lucru de reținut este că programatorul nu poate controla ordinea de execuție a
firelor. Pentru a înțelege gravitatea situației, încercați să rulați metoda main()
din exemplul de mai sus de câteva ori. Ieșire din consolă la a doua rulare: Eu sunt
Thread! Numele meu este Thread-0 Sunt Thread! Numele meu este Thread-4 Sunt Thread!
Numele meu este Thread-3 Sunt Thread! Numele meu este Thread-2 Sunt Thread! Numele
meu este Thread-1 Sunt Thread! Numele meu este Thread-5 Sunt Thread! Numele meu
este Thread-6 Sunt Thread! Numele meu este Thread-8 Sunt Thread! Numele meu este
Thread-9, sunt Thread! Numele meu este Thread-7 Console ieșire din a treia rulare:
Sunt Thread! Numele meu este Thread-0 Sunt Thread! Numele meu este Thread-3 Sunt
Thread! Numele meu este Thread-1 Sunt Thread! Numele meu este Thread-2 Sunt Thread!
Numele meu este Thread-6 Sunt Thread! Numele meu este Thread-4 Sunt Thread! Numele
meu este Thread-9, sunt Thread! Numele meu este Thread-5 Sunt Thread! Numele meu
este Thread-7 Sunt Thread! Numele meu este Thread-8
Probleme create de multithreading
În exemplul nostru cu cărți, ați văzut că multithreading rezolvă sarcini foarte
importante și poate face programele noastre mai rapide. Adesea de multe ori mai
repede. Dar multithreading-ul este considerat a fi un subiect dificil. Într-adevăr,
dacă este folosit necorespunzător, creează probleme în loc să le rezolve. Când spun
„creează probleme”, nu mă refer într-un sens abstract. Există două probleme
specifice pe care le poate crea multithreading: blocaj și condiții de cursă.
Deadlock este o situație în care mai multe fire așteaptă resurse deținute unul de
celălalt și niciunul dintre ele nu poate continua să ruleze. Vom vorbi mai multe
despre asta în lecțiile ulterioare. Următorul exemplu va fi suficient deocamdată:
Multithreading în Java: ce este, beneficiile sale și capcanele comune -
4Imaginează-ți că Thread-1 interacționează cu un obiect-1 și că Thread-2
interacționează cu Object-2. În plus, programul este scris astfel încât:
@Override
public void run() {
System.out.println("Thread executed: " + getName());
}
}
Acum imaginați-vă că programul este responsabil pentru rularea unui robot care
gătește mâncare! Thread-0 scoate ouăle din frigider. Thread-1 pornește aragazul.
Thread-2 primește o tigaie și o pune pe aragaz. Thread-3 aprinde aragazul. Firul-4
toarnă ulei în tigaie. Firul-5 rupe ouăle și le toarnă în tigaie. Thread-6 aruncă
cojile de ouă în coșul de gunoi. Thread-7 scoate ouăle fierte din arzător. Firul-8
pune ouăle fierte pe o farfurie. Thread-9 spală vasele. Uită-te la rezultatele
programului nostru: Fire executată: Fire-0 Fire executată: Thread-2 Thread
executată Thread-1 Thread executat: Thread-4 Thread executat: Thread-9 Thread
executat: Thread-5 Thread executat: Thread-8 Thread executat: Thread-7 Thread
executat: Thread-3 Este aceasta o rutină de comedie? :) Și totul pentru că munca
programului nostru depinde de ordinea de execuție a firelor. Având în vedere cea
mai mică încălcare a secvenței necesare, bucătăria noastră se transformă în iad,
iar un robot nebun distruge totul în jurul ei. Aceasta este, de asemenea, o
problemă comună în programarea cu mai multe fire. Veți auzi despre asta de mai
multe ori. În încheierea acestei lecții, aș dori să recomand o carte despre
multithreading.