multithreading java tutorial with examples
V tomto výučbe sa dozviete všetko o viacvláknových procesoch v prostredí Java, implementácii súbežnosti, životnom cykle vlákna, príklade triedy vlákien, vlákne pomocou spustiteľného rozhrania:
Súbežnosťou v počítačovom svete je schopnosť systému (či už je to aplikácia, počítač alebo programovací jazyk) vykonávať paralelne niekoľko inštancií programu alebo aplikácie.
Súčasným spustením inštancií alebo programov zaisťujeme vysokú priepustnosť a vyšší výkon, pretože môžeme využívať nevyužité zdroje, ako je hardvér operačného systému atď. Napríklad, ak má systém niekoľko CPU, potom môže aplikácia tieto CPU efektívne využiť a zvýšiť priepustnosť.
=> Navštívte tu sériu exkluzívnych výukových programov Java.
Čo sa dozviete:
- Čo je to multithreading v Jave
- Čo je vlákno v Jave
- Záver
Čo je to multithreading v Jave
V prostredí Java sa vlákna dajú považovať za chrbtovú kosť súbežnosti. Vlákno je spustiteľná, ľahká jednotka, ktorá pristupuje k zdieľaným zdrojom aj k vlastnému zásobníku hovorov.
Aplikácia Java je jeden proces a v rámci tejto aplikácie môžeme mať viac vlákien na dosiahnutie súbežnosti.
Vieme, že aplikácia spustená v systéme môže mať viac inštancií, ktoré sa zvyčajne nazývajú multi-doc aplikácie. Tieto inštancie aplikácií sa nazývajú procesy. Každému z týchto procesov je priradená exekučná jednotka známa ako vlákno.
V závislosti od operačného systému a požiadaviek aplikácie je možné procesu priradiť jedno vlákno alebo viac vlákien. Keď je procesu aplikácie priradených viac vlákien, musíme tieto viaceré vlákna vykonať súčasne.
„ Táto technika vykonávania alebo spustenia viacerých vlákien súčasne alebo súčasne je známa ako multithreading . “
Viacvláknové spracovanie jednoducho znamená, že - v tej istej aplikácii sa vykonáva viac ako jedno vlákno.
Programovací jazyk Java má zabudovanú podporu pre viacvláknové spracovanie.
Multithreading je znázornený na vyššie uvedenom diagrame. Ako je znázornené, v aplikácii je súčasne spustených viac vlákien.
Napríklad, desktopová aplikácia poskytujúca funkcie ako editácia, tlač atď. je viacvláknová aplikácia. Pretože v tejto aplikácii je tlač procesom na pozadí, môžeme vykonávať úpravy dokumentov a tlač dokumentov súčasne tak, že tieto funkcie priradíme dvom rôznym vláknam.
Vlákna vo viacvláknových aplikáciách bežia paralelne navzájom súčasne. Multithreading je teda tiež súčasťou súbežnosti v Jave. Upozorňujeme, že aj keď existuje viac vlákien, zdieľajú oblasť pamäte, čím šetria pamäť. Vlákna tiež môžu ľahko prepínať kontexty behom okamihu.
Multithreading je hlavne užitočný, pretože poskytuje súčasné vykonávanie dvoch alebo viacerých častí aplikácie. To umožňuje aplikácii využiť čas procesora na maximum a čas nečinnosti na minimum.
Nasleduje niekoľko výrazov, ktoré by sme mali poznať v súvislosti s prostredím multithreadingu, pretože sa často používajú.
Multitasking: Pri multitaskingu sa vykonáva viac ako jedna úloha súčasne.
Viacvláknové spracovanie: Multithreading, ako už bolo spomenuté, je proces vykonávania viacerých vlákien súčasne.
ako nájsť kľúč zabezpečenia siete na smerovači -
Viacnásobné spracovanie: Pri multiprocese sa vykonáva viac ako jeden proces súčasne. Podobné ako multitasking, ale tu je zapojených viac ako jeden procesor.
Paralelné spracovanie: Paralelné spracovanie je technika, pri ktorej v počítačovom systéme pracuje súčasne viac CPU.
Po diskusii o viacvláknových vláknach vyvstáva otázka, prečo vôbec viacvláknové vlákno potrebujeme?
Výhody multithreadingu
Multithreading má rôzne výhody, ktoré pomáhajú pri efektívnom programovaní.
Nasledujúce body to objasnia.
# 1) Efektívne využitie systémov s jedným CPU
Ak je v systéme iba jeden procesor s jedným vláknom, potom je čas CPU stratený. Keď je vlákno zaneprázdnené použitím iných zdrojov, ako napríklad IO, procesor je nečinný. Môžeme to vylepšiť a lepšie využiť CPU tým, že budeme mať viacvláknové aplikácie.
Použitím viacvláknového vlákna, ak je jedno vlákno vyrobené s CPU, môže ho druhé vlákno využiť. S viacerými vláknami sa doba nečinnosti procesora výrazne skráti.
# 2) Efektívne využitie viacerých systémov CPU
Rovnako ako jednotlivé procesory, aj v prípade systémov s viacerými procesormi sú aplikácie s viacerými vláknami schopné efektívne využívať viac procesorov.
# 3) Vylepšená používateľská skúsenosť s ohľadom na responzivitu a férovosť
Reakcia systému sa zlepšuje s viacvláknovými aplikáciami. Nezažívame „GUI zavesené“ keď máme v aplikácii viac vlákien vykonávajúcich rôzne úlohy a používatelia nemusia dlho čakať na odpoveď na svoje požiadavky.
Podobne sú používatelia správne služby vo viacvláknových systémoch.
Ako implementovať súbežnosť v Jave
Prvá trieda, pomocou ktorej môžeme implementovať súbežnosť v Jave, je java.lang.Thread trieda. Táto trieda vlákien tvorí základ súbežnosti v Jave.
My tiež máme java.lang.Runnable rozhranie, ktoré môže byť implementované triedou Java na abstraktné správanie vlákna. Pre pokročilý vývoj aplikácií môžeme využiť java.util.concurrent balík dostupný od verzie Java 1.5.
Vpred budeme podrobne diskutovať o súbežnosti v Jave. Poďme si v tomto tutoriále prediskutovať a porozumieť pojmu vlákna v Jave. V našich ďalších tutoriáloch o multithreadingu preskúmame rôzne koncepty multithreadingu a súbežnosti.
Čo je vlákno v Jave
Jedno vlákno možno definovať ako najmenšiu a ľahkú jednotku spracovania. V prostredí Java sa vlákna používajú v programoch používajúcich triedu „Thread“.
Vlákna Java sú dvoch typov:
# 1) Používateľské vlákno: používateľské vlákno sa vytvorí pri prvom spustení aplikácie. Potom môžeme vytvoriť toľko vlákien používateľov a démonov.
# 2) Vlákno démona: vlákna démonov sa používajú hlavne na pozadí a používajú sa napríklad na čistenie aplikácií atď.
Vlákna znižujú náklady na údržbu aplikácie. Znižuje tiež réžiu aplikácie.
Jeden príklad vlákna je uvedený nižšie:
public class Main{ public static void main (String () args){ System.out.println('This is a thread'); } }
Vyššie uvedený program zobrazí „Toto je vlákno“, ako keď sa spustí aplikácia, vytvorí sa používateľské vlákno. Vo vyššie uvedenom programe je hlavnou funkciou východiskový bod aplikácie, ktorý vytvára užívateľské vlákno.
Životný cyklus vlákna
Nasledujúca schéma zobrazuje životný cyklus vlákna v prostredí Java.
Ako je zrejmé z vyššie uvedeného diagramu, vlákno v prostredí Java má nasledujúce stavy:
# 1) Nové: Vlákno, ktoré bolo práve vytvorené z triedy vlákien, má pôvodne „nový“ stav. Je ešte potrebné začať. Toto vlákno sa tiež nazýva „Rodená niť“ .
# 2) Spustiteľné: V tomto stave sa inštancia vlákna vyvolá pomocou metódy „Štart“ .
# 3) Beh: Vyvolá sa počiatočná metóda inštancie vlákna a vlákno začne vykonávať. Toto je stav spustenia. Väčšinou plánovač plánuje a spravuje vlákna.
# 4) Blokované: V aplikácii je viac vlákien. Tieto vlákna musia čakať na ďalšie, pretože ich vykonávanie sa musí synchronizovať.
# 5) Ukončené: Po ukončení procesu vykonávania vlákna je toto vlákno ukončené alebo je zastavené jeho vykonávanie.
Takže sa najskôr vytvorí vlákno, ktoré sa naplánuje a neskôr vlákno vykoná plánovač. Zatiaľ čo bežiace vlákno môže byť blokované alebo pozastavené pre inú aktivitu. Potom je obnovená a po dokončení spracovania sa vlákno vykoná.
Priority vlákien
O tom, ako sa má s jedným vláknom zaobchádzať, pokiaľ ide o ostatné vlákna v aplikácii, rozhoduje priorita vlákna. Prioritou vlákna je celé číslo.
Nižšie uvádzame niekoľko bodov, ktoré si treba pamätať o prioritách vlákien:
- Priority vlákna sú celé čísla.
- Pomocou priority vlákna sa môžeme rozhodnúť, kedy by sme mali prepnúť z jedného vlákna v bežiacom stave na iné. Toto je proces prepínania kontextu, pri ktorom prepíname kontexty vlákien.
- Kedykoľvek môže vlákno dobrovoľne uvoľniť svoju kontrolu nad CPU. Potom môže prevziať vlákno s najvyššou prioritou.
- Podobne môže vlákno s vyššou prioritou predísť ktorémukoľvek inému vláknu s nižšou prioritou.
- Trieda vlákna poskytuje metódu setPriority (), ktorá sa používa na nastavenie priority vlákna.
- Namiesto celých čísel môžeme tiež použiť konštanty MIN_PRIORITY, MAX_PRIORITY alebo NORM_PRIORITY.
Vytvorte vlákno
Vlákno môžeme vytvoriť jedným z nasledujúcich spôsobov:
- Rozšírenie triedy Java „Thread“.
- Implementuje sa „spustiteľný program“.
Rozšírenie triedy Java „Thread“
Trieda „Vlákno“ obsahuje konštruktory a metódy, ktoré nám umožňujú vytvárať a vykonávať operácie s objektom vlákna. Trieda Thread interne implementuje rozhranie Runnable a tiež rozširuje triedu Object.
V nasledujúcej tabuľke je zhrnutie rôznych konštruktorov a metód triedy Thread ().
Staviteľ / | Prototyp | Popis |
---|---|---|
spať | spánok vo verejnom priestore (dlhé milisekundy) | Vykonávanie aktuálneho vlákna je zastavené na zadané milisekundy. |
Konštruktor vlákna () | Závit () | Predvolený konštruktor na vytvorenie objektu vlákna. |
Vlákno (názov reťazca) | Konštruktor na vytvorenie objektu Thread so zadaným názvom. | |
Vlákno (spustiteľné r) | Vytvorte inštanciu vlákna so zadaným objektom rozhrania Runnable. | |
Vlákno (spustiteľné r, názov reťazca) | Vytvorte inštanciu vlákna so zadaným spustiteľným objektom rozhrania a menom | |
bežať | beh verejnej neplatnosti () | Metóda Run vykoná akciu pre vlákno. Vyvolá vlákno. |
začať | začiatok verejnej neplatnosti () | Používa sa na spustenie vykonávania vlákna. Interne v tomto vlákne metóda JVM volá run (). |
pripojiť sa | public void join () | Počkajte, kým niť uhynie |
verejné neplatné pripojenie (dlhé milisekundy) | Počkajte určené milisekundy, kým vlákno zomrie. | |
getPriority | public int getPriority () | Vrátiť prioritu vlákna |
setPriority | public int setPriority (int priorita) | Zmeňte prioritu vlákna na zadanú prioritu |
getName | verejný reťazec getName () | vráti názov vlákna. |
setName | public void setName (názov reťazca) | Nastavte názov vlákna na zadaný reťazec |
currentThread | verejné vlákno currentThread () | Vráti odkaz na vlákno, ktoré je momentálne aktívne |
getId | public int getId () | Id spätného vlákna |
getState () | public Thread.State getState () | Vráti aktuálny stav vlákna |
je nažive | public boolean isAlive () | Skontrolujte, či je vlákno živé, a ak je to pravda, vráťte sa späť. |
výnos | výnos verejnej neplatnosti () | Dočasne pozastaví súčasné vlákno a umožní vykonávanie ďalších vlákien. |
isDaemon | public boolean isDaemon () | Skontrolujte, či je vlákno démonovým vláknom; návrat true ak áno. |
setDaemon | public void setDaemon (boolean b) | Nastavte vlákno ako vlákno démona, ak b = true; inak nastavené ako užívateľské vlákno. |
prerušiť | prerušenie verejnej neplatnosti () | Prerušiť aktuálne vlákno. |
je prerušený | public boolean isInterrupted () | Skontrolujte, či nie je vlákno prerušené. |
prerušený | public static boolean prerušený () | Skontrolujte, či nebolo prerušené súčasné vlákno. |
dumpStack | Static void dumpStack () | Vytlačí trasovanie zásobníka aktuálneho vlákna do štandardného toku chýb. |
pozastaviť | pozastavenie verejnej neplatnosti () | Pozastaví všetky vlákna. (** metóda je v najnovších verziách Java zastaraná) |
pokračovať | obnovenie verejnej neplatnosti () | Obnovte zavesené vlákno. (** metóda je v najnovších verziách Java zastaraná) |
zastav | verejné neplatné zastavenie () | Zastaví vlákno. (** metóda je v najnovších verziách Java zastaraná) |
Tieto metódy vlákien budeme rozpracovávať v našom ďalšom návode na viacvláknové spracovanie.
Spustenie vlákna
Metóda start (), ktorá sa používa na spustenie vlákna, vykonáva nasledujúce kroky:
- Spustí novú inštanciu vlákna s novým CallStack.
- Stav vlákna sa zmení z nového na spustiteľný.
- Keď je na rade vlákno, vykoná metódu run ().
Implementuje sa „spustiteľné“ rozhranie
Inštanciu vlákna je možné vytvoriť aj pomocou rozhrania Runnable. Ak chcete vytvoriť inštanciu vlákna, trieda, ktorej objekty by sa mali vykonávať vláknom, by mala implementovať rozhranie Runnable.
Rozhranie Runnable má iba jednu metódu:
public void run () => this method is used to execute the thread.
Príklad triedy vlákna
Teraz si ukážeme vlákno v Jave pomocou triedy vlákna.
//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...'); } }
Výkon
Vlákno Java pomocou spustiteľného rozhrania
Nasledujúci príklad demonštruje použitie rozhrania Runnable na vytvorenie inštancie vlákna.
//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...'); } }
Výkon
Ako zastaviť vlákno v Jave
Videli sme príklady vlákien vyššie. Z týchto príkladov vieme, že keď metóda spustenia dokončí vykonávanie, vlákno sa zastaví alebo sa zastaví aj kvôli niektorým výnimkám.
Staršie verzie Javy mali v triede vlákien metódu stop (), ktorú bolo možné použiť na priame zastavenie vlákna. Teraz je však z bezpečnostných dôvodov zastarané. Preto musíme použiť ďalšie metódy, aby sme zastavili vlákno, ktoré sa vykonáva.
Existujú dve metódy, ktoré môžeme použiť na zastavenie vlákna.
- Používanie prchavej boolovskej premennej
- Používanie prerušení.
V tejto časti si rozoberieme obidve tieto metódy zastavenia vlákna.
Používanie prchavej boolovskej premennej
V tejto metóde udržiavame boolovskú premennú say flag, ktorá zastaví vlákno. Vlákno beží dovtedy, kým je boolovská premenná nastavená na hodnotu true. V okamihu, keď sa stane nepravdivým, vlákno sa zastaví.
Špecialitou tejto metódy je, že logickú premennú deklarujeme ako „ prchavý ”Tak, aby sa vždy čítalo z hlavnej pamäte a program ju nemohol ukladať do medzipamäte CPU. Týmto spôsobom nebude žiadny rozdiel v nastavených a načítaných hodnotách.
Implementácia zastavenia vlákna pomocou volatilnej boolovskej premennej je uvedená nižšie.
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(); } }
Výkon
Poznámka: Tu sme zobrazili iba časť výstupu. Pred zastavením môže vlákno bežať niekoľko minút. Aby sme mohli získať rôzny výstup v rôznych systémoch.
Používanie prerušení
Tu je vlákno zastavené pomocou metódy prerušenia (), ako sme už diskutovali vyššie v metódach triedy vlákien. Metóda interrupt () nastavuje stav vlákna ako prerušený. Tento stav sa odovzdáva do cyklu while metódy run (). Stav prerušenia môžeme získať metódou prerušených ().
Nasledujúci program demonštruje použitie metódy prerušenia () na zastavenie vlákna.
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(); } }
Výkon
často kladené otázky
Otázka č. 1) Prečo používame viacvláknové spracovanie v Jave?
Odpoveď: Viacvlákno umožňuje súčasné alebo súčasné vykonávanie dvoch alebo viacerých vlákien v aplikácii. Súbežné vykonávanie maximalizuje priepustnosť a tiež maximálne využíva procesor.
Otázka 2) Čo je to multithreading? Aké sú jeho typy?
Odpoveď: Viacvlákno znamená vykonanie viac ako jedného vlákna. Toto vykonávanie môže byť súčasné alebo paralelné. Multithreading má teda dva typy, tj. Súbežný alebo paralelný.
Otázka 3) Čo je to multithreading vs. multiprocesing?
Odpoveď: V multithreadingu existuje viac vlákien pre rovnaké alebo rôzne procesy a tieto vlákna sa vykonávajú súčasne, aby sa zvýšila výpočtová rýchlosť systému. Pri viacprocesovom spracovaní má systém viac ako dva CPU a vykonáva sa súčasne viac procesov.
Otázka č. 4) Aké sú výhody multithreadingu v Jave?
Odpoveď: Pomocou viacvláknového vlákna môžeme spúšťať rôzne časti aplikácie súčasne pomocou vlákien. Viacvláknové spracovanie zvyšuje priepustnosť systému. Multithreading tiež maximalizuje využitie CPU, pretože rôzne vlákna nepretržite využívajú CPU.
Otázka č. 5) Je program Multithreading vhodný na hranie hier?
Odpoveď: Áno, hlavne pre moderné hry.
informatica rozhovor otázky a odpovede pre skúsených
Záver
Toto všetko je o zavedení multithreadingu. V tomto výučbe sme diskutovali o súbežnosti a viacvláknových procesoch v Jave. Diskutovali sme o vytvorení vlákna s triedou Thread, ako aj s rozhraním Runnable a poskytli sme vhodné príklady.
Taktiež sme sa podrobne naučili koncepty jedného vlákna a jeho vytváranie. V tomto výučbe sa venujeme koncepciám vlákien vrátane životného cyklu vlákna, zastaveniu vlákna, typom vlákna atď.
Diskutovali sme tiež o multithreadingu v dĺžke a súbežnosti v Jave. Na konci tohto tutoriálu by mal byť čitateľ schopný ľahko pochopiť pojmy súbežnosti a multithreadingu a tiež vlákna v Jave.
=> Dajte si pozor na jednoduchú sériu školení Java tu.
Odporúčané čítanie
- Multithreading v C ++ s príkladmi
- Vlákna Java s metódami a životným cyklom
- Thread.Sleep () - Metóda Thread Sleep () v Jave s príkladmi
- Výukový program JAVA pre začiatočníkov: viac ako 100 praktických výučbových programov Java Video
- Výukový program Java Reflection s príkladmi
- Java String obsahuje () Výukový program metód s príkladmi
- Jagged Array In Java - návod s príkladmi
- Výukový program triedy skenerov Java s príkladmi