multithreading java tutorial with examples
Ovaj vodič objašnjava sve o multitreadingu u Javi, implementaciji paralelnosti, životnom ciklusu niti, primjeru klase niti, niti pomoću izvedljivog sučelja:
Istodobnost u računalnom svijetu je sposobnost sustava (bilo da je to aplikacija, računalo ili programski jezik) da paralelno izvršava nekoliko instanci programa ili aplikacije.
Istodobnim pokretanjem instanci ili programa osiguravamo visoku propusnost i veće performanse jer možemo iskoristiti neiskorištene resurse poput hardvera operativnog sustava itd. Na primjer, ako sustav ima nekoliko CPU-a, tada aplikacija može učinkovito koristiti te CPU i povećati protok.
=> Posjetite ovdje za ekskluzivnu seriju udžbenika za Java.
Što ćete naučiti:
Što je višenitnost u Javi
U Javi se niti mogu gledati kao okosnica istodobnosti. Nit je izvršna, lagana jedinica koja pristupa zajedničkim resursima kao i vlastitom stogu poziva.
Java aplikacija je jedan proces i unutar te aplikacije možemo imati više niti za postizanje istodobnosti.
Znamo da aplikacija koja se izvodi u sustavu može imati više instanci i one se obično nazivaju višedokumentalnim aplikacijama. Te se instance aplikacije nazivaju procesi. Svakom od tih procesa dodijeljena je izvršna jedinica poznata kao nit.
Ovisno o operativnom sustavu i zahtjevima aplikacije, procesu se može dodijeliti jedna nit ili više niti. Kada je aplikacijskom procesu dodijeljeno više niti, tada trebamo izvršavati te više niti istovremeno.
' Ova tehnika izvođenja ili izvođenja više niti istovremeno ili istodobno poznata je pod nazivom višestruko obrađivanje niti . '
Multithreading jednostavno znači da -imamo više od jedne niti koja se izvršava unutar iste aplikacije.
Programski jezik Java ima ugrađenu podršku za multithreading.
Multithreading je prikazan na gornjem dijagramu. Kao što je prikazano, postoji više niti koje se istodobno izvode unutar aplikacije.
Na primjer, stolna aplikacija koja pruža funkcije poput uređivanja, ispisa itd. je višenitna aplikacija. U ovoj aplikaciji, budući da je ispis pozadinski postupak, možemo istovremeno izvršavati uređivanje dokumenata i ispisivanje dokumenata dodijelivši ove dvije niti.
Niti u višenitnim aplikacijama izvode se paralelno jedna s drugom na istodoban način. Stoga je višenitnost također dio istodobnosti u Javi. Imajte na umu da iako postoji više niti, oni dijele memorijsko područje čime štede na memoriji. Također, niti mogu lako prebaciti kontekst u trenu.
Višenitnost je uglavnom korisna jer omogućuje istodobno izvršavanje dva ili više dijelova aplikacije. To omogućuje aplikaciji maksimalno korištenje procesorskog vremena, a vrijeme mirovanja svedeno na minimum.
Slijede neki od pojmova koje bismo trebali znati u vezi s okruženjem s više niti, jer se često koriste.
Višezadaćnost: U multitaskingu se istodobno izvršava više zadataka.
Višenitnost: Višenitnost, kao što je već spomenuto, postupak je istodobnog izvršavanja više niti.
prednosti i nedostaci linux-a i windows-a
Višeprocesiranje: U višeprocesiranju istodobno se izvršava više procesa. Slično multitaskingu, ali ovdje je uključeno više od jednog CPU-a.
Paralelna obrada: Paralelna obrada je tehnika u kojoj više procesora istovremeno radi u računalnom sustavu.
Nakon rasprave o multitreadingu postavlja se pitanje zašto nam je multithreading uopće potreban?
Prednosti višenitnosti
Multithreading ima razne prednosti koje pomažu u učinkovitom programiranju.
Točke u nastavku jasno će objasniti.
# 1) Učinkovito korištenje pojedinačnih CPU sustava
Kada je u sustavu samo jedan CPU, s jednom niti, tada se troši vrijeme procesora. Kad je nit zauzet korištenjem drugih resursa poput IO-a, CPU je u stanju mirovanja. To možemo poboljšati i bolje iskoristiti CPU ako imamo višenitne aplikacije.
Korištenjem multithreadinga, ako je jedna nit izvedena s CPU-om, onda je druga nit može iskoristiti. S više niti, vrijeme mirovanja CPU-a bit će znatno smanjeno.
# 2) Učinkovito korištenje više CPU sustava
Baš poput pojedinačnih CPU-a, čak i sa sustavima koji imaju više CPU-a, multithreading aplikacije mogu učinkovito koristiti više CPU-a.
# 3) Poboljšano korisničko iskustvo s obzirom na reaktivnost i pravednost
Odziv sustava poboljšava se s višenitnim aplikacijama. Mi ne doživljavamo 'GUI visi' kada imamo više niti koje izvršavaju razne zadatke u aplikaciji, a korisnici ne trebaju dugo čekati da bi dobili odgovor na svoje zahtjeve.
Slično tome, korisnici su ispravno servisi u višenitnim sustavima.
Kako implementirati istodobnost u Javi
Prva klasa pomoću koje možemo implementirati istodobnost u Javi je java.lang.Nit razred. Ova klasa Thread čini osnovu istodobnosti u Javi.
Također imamo java.lang.Izvodljiv sučelje koje Java klasa može primijeniti za apstrahiranje ponašanja niti. Za napredni razvoj aplikacija možemo koristiti java.util.concurrent paket dostupan od Jave 1.5.
Dalje ćemo detaljno razgovarati o paralelnosti u Javi. Razmotrimo i shvatimo koncept niti u Javi u ovom vodiču. U našim slijedećim vodičima o multithreadingu istražit ćemo razne koncepte multithreadinga i paralelnosti.
Što je nit u Javi
Jedna nit može se definirati kao najmanja i lagana jedinica obrade. U Javi se niti koriste u programima koji koriste klasu 'Thread'.
Java niti su dvije vrste:
# 1) Korisnička nit: korisnička nit stvara se pri prvom pokretanju aplikacije. Tada možemo stvoriti što više korisničkih i demonskih niti.
# 2) Daemon nit: niti demona uglavnom se koriste u pozadini i koriste se za zadatke poput čišćenja aplikacije itd.
Niti smanjuju troškove održavanja aplikacije. Također smanjuje opće troškove aplikacije.
Primjer jedne niti prikazan je u nastavku:
public class Main{ public static void main (String () args){ System.out.println('This is a thread'); } }
Gornji program će prikazati 'Ovo je nit', jer kada se aplikacija pokrene, kreira se korisnička nit. U gornjem programu glavna je funkcija početna točka aplikacije i ona stvara korisničku nit.
Životni ciklus niti
Sljedeći dijagram prikazuje životni ciklus niti u Javi.
Kao što je prikazano na gornjem dijagramu, nit u Javi ima sljedeća stanja:
# 1) Novo: U početku nit koja je upravo kreirana iz klase niti ima 'novo' stanje. Tek treba započeti. Ova nit se također naziva 'Rođena nit' .
# 2) Izvodljivo: U ovom se stanju instanca niti poziva metodom 'početak' .
# 3) Trčanje: Poziva se metoda pokretanja instance niti i nit započinje izvršenje. Ovo je tekuće stanje. Uglavnom rokovnik planira i upravlja nitima.
# 4) Blokirano: U aplikaciji postoji više niti. Te niti moraju pričekati drugu jer se njihovo izvršavanje mora sinkronizirati.
# 5) Ukinuto: Jednom kada je postupak izvođenja niti završen, nit se prekida ili se njezino izvršavanje zaustavlja.
Dakle, nit se prvo kreira, zatim zakazuje, a kasnije planer izvršava nit. Iako se pokrenuta nit može blokirati ili suspendirati zbog neke druge aktivnosti. Zatim se nastavlja i nakon završetka obrade nit se izvršava.
Prioriteti niti
Prioritet niti odlučuje kako će se jedna nit tretirati u odnosu na druge niti u aplikaciji. Prioritet niti je cijeli broj.
U nastavku su navedene neke točke koje treba zapamtiti o prioritetima niti:
- Prioriteti niti su cjelobrojni brojevi.
- Koristeći prioritet niti, možemo odlučiti kada bismo trebali prebaciti s jedne niti u tekućem stanju na drugu. Ovo je postupak prebacivanja konteksta u kojem mijenjamo kontekst niti.
- U bilo kojem trenutku nit može dobrovoljno otpustiti kontrolu nad CPU-om. Tada nit s najvišim prioritetom može preuzeti.
- Slično tome, nit višeg prioriteta može spriječiti bilo koju drugu nit nižeg prioriteta.
- Klasa niti pruža metodu setPriority () koja se koristi za postavljanje prioriteta niti.
- Na mjestu cijelih brojeva možemo koristiti i konstante MIN_PRIORITY, MAX_PRIORITY ili NORM_PRIORITY.
Stvori nit
Nit možemo stvoriti na jedan od sljedećih načina:
- Proširenje klase Java 'Thread'.
- Provedba 'Runnable'.
Proširenje klase Java 'Thread'
Klasa 'Thread' sadrži konstruktore i metode koji nam omogućuju stvaranje i izvođenje operacija nad objektom niti. Klasa Thread interno implementira Runnable sučelje i također proširuje klasu Object.
Sljedeća tablica daje sažetak različitih konstruktora i metoda klase Thread ().
Graditelj/ | Prototip | Opis |
---|---|---|
spavati | javno prazno spavanje (duge milisekunde) | Izvršenje trenutne niti zaustavlja se na određene milisekunde. |
Konstruktor niti () | Nit() | Zadani konstruktor za stvaranje objekta Thread. |
Nit (naziv niza) | Konstruktor za stvaranje objekta Thread s navedenim imenom. | |
Navoj (izvodljivi r) | Stvorite instancu niti s navedenim objektom sučelja koji se može izvoditi. | |
Nit (izvodljivi r, naziv niza) | Stvorite instancu niti s navedenim objektom sučelja koji se može izvoditi i dodijeljenim imenom | |
trčanje | javna void vožnja () | Metoda izvođenja izvodi radnju za nit. Priziva nit. |
početak | javni void start () | Koristi se za pokretanje izvođenja niti. Interno JVM poziva metodu run () na ovoj niti. |
pridružiti | javno prazno pridruživanje () | Pričekajte da nit umre |
javno prazno pridruživanje (duge milisekunde) | Pričekajte određene milisekunde da nit umre. | |
getPriority | javni int getPriority () | Vrati prioritet niti |
setPriority | javni int setPriority (int prioritet) | Promijenite prioritet niti u zadani prioritet |
getName | javni niz getName () | vrati ime niti. |
setName | javna praznina setName (naziv niza) | Postavite ime niti na navedeni niz |
currentThread | javna nit currentThread () | Vraća referencu niti koja je trenutno aktivna |
getId | javni int getId () | Povratna nit Id |
getState () | javni Thread.State getState () | Vraća trenutno stanje niti |
živ je | javna logička vrijednost isAlive () | Provjerite je li nit živa i vratite true ako da. |
prinos | prinos javne praznine () | Privremeno zaustavlja trenutnu nit i omogućuje izvršavanje ostalih niti. |
jeDeemon | javni boolean isDaemon () | Provjerite je li nit daemon nit; vrati true ako da. |
setDaemon | javna void setDaemon (logička b) | Postavite nit kao nit demona ako je b = true; inače postavljen kao nit korisnika. |
prekinuti | prekid javne praznine () | Prekini trenutnu nit. |
isInterrupted | javna logička vrijednost isInterrupted () | Provjerite je li nit prekinut. |
prekinuo | javna statička logička vrijednost prekinuta () | Provjerite je li trenutna nit prekinuta. |
dumpStack | Statička praznina dumpStack () | Ispisuje trag stoga trenutne niti u standardni tok pogreške. |
obustaviti | obustava javne praznine () | Obustavlja sve niti. (** metoda je zastarjela u najnovijim verzijama Java) |
nastaviti | javni prazni životopis () | Nastavi suspendirani konac. (** metoda je zastarjela u najnovijim verzijama Java) |
Stop | zaustavljanje javne praznine () | Zaustavlja nit. (** metoda je zastarjela u najnovijim verzijama Java) |
O ovim metodama niti razradit ćemo ih u sljedećem vodiču o multithreadingu.
Pokretanje niti
Metoda start () koja se koristi za pokretanje niti izvodi sljedeće korake:
- Pokreće novu instancu niti s novim CallStackom.
- Stanje niti promijenjeno je iz novog u izvodljivo.
- Kada je red na niti, izvršava metodu run ().
Implementacija sučelja 'Runnable'
Instanca niti također se može stvoriti pomoću sučelja Runnable. Da bi se stvorila instanca niti, klasa čiji bi objekti trebala biti izvedena pomoću niti trebala bi implementirati Runnable sučelje.
Izvršno sučelje ima samo jednu metodu:
public void run () => this method is used to execute the thread.
Primjer klase niti
Sada demonstrirajmo nit u Javi pomoću klase niti.
//class inherited from 'Thread' class ThreadClassDemo extends Thread { private int number; //class constructor public ThreadClassDemo(int number) { this.number = number; } //run method => execution code for thread public void run() { int counter = 0; int numInt = 0; //prints the number till specified number is reached, starting from 10 do { numInt = (int) (counter + 10); System.out.println(this.getName() + ' prints ' + numInt); counter++; } while(numInt != number); System.out.println('** Correct! ' + this.getName() + 'printed ' + counter + ' times.**'); } } public class Main { public static void main(String () args) { System.out.println('Starting thread_1...'); //create a thread class instance Thread thread_1 = new ThreadClassDemo(15); //start the thread thread_1 thread_1.start(); try { //wait for thread_1 to die thread_1.join(); } catch (InterruptedException e) { System.out.println('Thread interrupted.'); } System.out.println('Starting thread_2...'); Thread thread_2 = new ThreadClassDemo(20); //start thread_2 thread_2.start(); System.out.println('main() is ending...'); } }
Izlaz
Java nit pomoću sučelja za pokretanje
Sljedeći primjer pokazuje upotrebu sučelja koje se može izvoditi za stvaranje instance niti.
//class implements Runnable interface class RunnableDemo implements Runnable { private String message; //class constructor public RunnableDemo(String message) { this.message = message; } //run method public void run() { while(true) { System.out.println(message); } } } public class Main { public static void main(String () args) { //create first thread instance hello Runnable hello = new RunnableDemo('Hello, Greetings!!!'); Thread thread1 = new Thread(hello); thread1.setDaemon(true); //set this thread as daemon thread1.setName('hello'); System.out.println('Starting First thread...'); //start the thread thread1.start(); //create second thread instance bye Runnable bye = new RunnableDemo('Bye for now!!'); Thread thread2 = new Thread(bye); thread2.setPriority(Thread.MIN_PRIORITY); //set priority to min thread2.setDaemon(true); //set as daemon thread System.out.println('Starting goodbye thread...'); //start the thread thread2.start(); System.out.println('main() is ending...'); } }
Izlaz
Kako zaustaviti nit u Javi
Primjere niti smo vidjeli gore. Iz ovih primjera znamo da kada metoda izvođenja završi s izvršenjem, nit se zaustavi ili se zaustavi zbog nekih iznimki.
Ranije verzije Jave imale su stop () metodu u klasi Thread koja se mogla koristiti za izravno zaustavljanje niti. Ali sada je zastario iz sigurnosnih razloga. Stoga trebamo upotrijebiti druge metode kako bismo zaustavili nit koja se izvršava.
Dvije su metode koje možemo upotrijebiti da zaustavimo nit.
- Korištenje hlapljive logičke varijable
- Korištenje prekida.
U ovom ćemo odjeljku razgovarati o obje metode zaustavljanja niti.
Korištenje hlapljive logičke varijable
U ovoj metodi održavamo logičku varijablu say flag da zaustavimo nit. Nit se izvodi sve dok je logička varijabla postavljena na true. U trenutku kada postane lažno, nit se zaustavlja.
Posebnost ove metode je što logičku varijablu deklariramo kao „ hlapljiv ”, Tako da se uvijek čita iz glavne memorije, a program ga ne može predmemorirati u predmemoriju CPU-a. Na taj način neće biti razlike u postavljenim i očitanim vrijednostima.
Implementacija zaustavljanja niti pomoću hlapljive logičke varijable prikazana je u nastavku.
class StopThread extends Thread { private volatile boolean stop_flag = true; //initially set to true public void stopRunning() { stop_flag = false; //set stop_flag to false } @Override public void run() { while (stop_flag) { //keep checking value of stop_flag System.out.println('Thread is running...'); } System.out.println('Thread stopped!!!'); } } public class Main { public static void main(String() args) { //create a thread instance StopThread stop_thread = new StopThread(); //start the thread stop_thread.start(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //call stopRunning() method to stop the thread stop_thread.stopRunning(); } }
Izlaz
Bilješka: Ovdje smo prikazali samo dio rezultata. Konac se može pokretati nekoliko minuta prije zaustavljanja. Tako da možemo dobiti različite rezultate na različitim sustavima.
Korištenje prekida
Ovdje se nit zaustavlja pomoću metode interrupt () kao što smo već raspravljali gore u metodama klase niti. Metoda interrupt () postavlja status niti kao prekinutu. Ovaj se status prenosi u while petlju metode run (). Status prekida možemo dobiti metodom interrupted ().
Sljedeći program prikazuje upotrebu metode interrupt () za zaustavljanje niti.
class StopThread extends Thread { @Override public void run() { while (!Thread.interrupted()) { //check for interrupted status System.out.println('Thread is running...'); } System.out.println('Thread stopped!!!'); } } public class Main { public static void main(String() args) { //create a thread instance StopThread stop_thread = new StopThread(); //start the thread stop_thread.start(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //interrupt the thread stop_thread.interrupt(); } }
Izlaz
youtube u mp3 više od 20 min
Često postavljana pitanja
P # 1) Zašto koristimo Multithreading u Javi?
Odgovor: Multithreading omogućuje istovremeno ili istovremeno izvršavanje dviju ili više niti u aplikaciji. Istovremeno izvršavanje maksimizira protok i također koristi CPU na maksimum.
P # 2) Što je Multithreading? Koje su njegove vrste?
Odgovor: Multithreading znači izvršavanje više od jedne niti. Ovo izvršavanje može biti istovremeno ili paralelno. Dakle, višenitnost ima dvije vrste, tj. Istodobnu ili paralelnu.
P # 3) Što je Multithreading vs Multiprocessing?
Odgovor: U multithreading-u postoji više niti za iste ili različite procese i te se niti izvršavaju istodobno kako bi se poboljšala računalna brzina sustava. U višeprocesiranju sustav ima više od dva CPU-a i više se procesa izvršava istovremeno.
P # 4) Koje su prednosti Multithreadinga u Javi?
Odgovor: Korištenjem multitreadinga možemo istovremeno izvršavati različite dijelove aplikacije pomoću niti. Višenitnost povećava propusnost sustava. Multithreading također maksimizira upotrebu CPU-a jer različite niti kontinuirano koriste CPU.
P # 5) Je li multithreading dobar za igre?
Odgovor: Da, posebno za moderne igre.
Zaključak
Ovdje se sve radi o uvođenju multithreadinga. U ovom smo priručniku raspravljali o istodobnosti i višestrukom uvođenju niti u Javi. Razgovarali smo o stvaranju niti s klasom Thread kao i sučeljem Runnable i dali smo odgovarajuće primjere.
Također smo detaljno naučili koncepte jedne niti i njezino stvaranje. Koncepti niti, uključujući životni ciklus niti, zaustavljanje niti, vrste niti itd. Razmatrani su u ovom vodiču.
Također smo dugo raspravljali o multitreadingu i istodobnosti u Javi. Na kraju ovog vodiča čitatelj bi trebao moći lako shvatiti koncepte istodobnosti i višestrukosti, kao i niti u Javi.
=> Ovdje pripazite na jednostavnu seriju Java treninga.
Preporučena literatura
- Višenitnost u jeziku C ++ s primjerima
- Java niti s metodama i životnim ciklusom
- Thread.Sleep () - metoda spavanja niti () u Javi s primjerima
- JAVA Tutorial za početnike: 100+ praktičnih Java Video tutorijala
- Java Vodič za refleksiju s primjerima
- Java String sadrži () Vodič za metode s primjerima
- Nazubljeni niz u Javi - Vodič s primjerima
- Vodič za razred Java Scannera s primjerima