Odporúčaná, 2024

Redakcia Choice

Rozdiel medzi triedou vlákien a spustiteľným rozhraním v jazyku Java

Niť možno definovať dvomi spôsobmi. Po prvé, rozšírením triedy Thread, ktorá už implementovala rozhranie Runnable. Po druhé, priamo implementáciou Runnable rozhrania . Keď definujete vlákno rozšírením triedy Thread, musíte prepísať metódu run () v triede Thread. Keď definujete vlákno implementujúce rozhranie Runnable, musíte implementovať iba metódu run () rozhrania Runnable. Základný rozdiel medzi Thread a Runnable spočíva v tom, že každý vlákno definované rozšírením triedy Thread vytvára jedinečný objekt a priradí ho k tomuto objektu. Na druhej strane každé vlákno definované implementáciou rozhrania Runnable zdieľa rovnaký objekt.

Pozrite si niektoré ďalšie rozdiely medzi Thread a Runnable pomocou porovnávacej tabuľky uvedenej nižšie:

Porovnávacia tabuľka

Základ pre porovnaniezávitRunnable
základnéKaždé vlákno vytvára jedinečný objekt a priradí sa mu to.Viaceré vlákna zdieľajú rovnaké objekty.
PamäťKeďže každé vlákno vytvorí jedinečný objekt, vyžaduje viac pamäte.Keďže viaceré vlákna zdieľajú rovnaký objekt, používa sa menej pamäte.
rozšírenieV jazyku Java nie je povolené viacnásobné dedičstvo, pretože trieda rozširuje triedu vlákna, ale nemôže rozšíriť žiadnu inú triedu.Ak trieda definuje vlákno implementujúce rozhranie Runnable, má šancu rozšíriť jednu triedu.
použitiePoužívateľ musí rozšíriť triedu vlákien len vtedy, ak chce prepisovať ostatné metódy v triede Thread.Ak sa chcete špecializovať iba na metódu spustenia, implementácia programu Runnable je lepšou voľbou.
spájanieRozšírenie Trieda závitu zavádza tesné spojenie, pretože trieda obsahuje kód triedy Thread a tiež úlohu priradenú vláknuImplementácia rozhrania Runnable zavádza voľnú spojku, pretože kód závitu je oddelený od úlohy vlákien.

Definícia triedy vlákien

Závit je trieda v balíku java.lang . Trieda Thread rozširuje triedu Object a implementuje rozhrania Runnable . Trieda Thread obsahuje konštruktory a metódy vytvárania a ovládania vlákien. Pri vytváraní viacerých vlákien vytvoríme každý vlákno jedinečný objekt a spojime sa s ním. Ak vytvoríte vlákno rozšírenie triedy Thread, ďalej nemôžete rozšíriť žiadnu inú triedu, pretože java nepodporuje viacnásobné dedičstvo. Takže by ste sa mali rozhodnúť rozšíriť triedu Thread len vtedy, keď chcete prepísať aj niektoré ďalšie metódy triedy Thread. Pozrime sa na príklad vytvorenia vlákna rozšírenia triedy Thread.

 / * Definovanie vlákna * / Trieda Mythread rozširuje vlákno {/ * úloha vlákna * / public void run () {pre (int i = 0; i <10; i ++) {System.Out.Println ); }} Trieda mainThread {/ * úloha hlavného vlákna * / public static void main (String args []) {Mythread mt = nový Mythread (); / * hlavná niť vytvorila podprocess * / mt.start (); pre (int i = 0; i <10; i ++) {System.Out.Print ("Hlavný závit"); }}} / * Výstup * / Hlavný závit Hlavný závit Hlavný závit Hlavný závit Detský závit Detský závit Detský závit Detský závit Detský závit Hlavný závit Detský závit Hlavný závit Hlavný závit Detský závit Detský závit Hlavný závit Hlavný závit Detský závit Detský závit Hlavný závit 

V uvedenom kóde vytvorím triedu Mythread, ktorá rozširuje triedu vlákien a prepíše metódu spustenia triedy Thread. V triede, ktorá obsahuje hlavnú metódu, vytvorím objekt vlákna (mt) triedy Mythread a použijem objekt nite vyvolaný metódou start (). Metóda štartu spustí vykonanie vlákna a súčasne JVM vyvolá metódu spustenia vlákna. Teraz sú v programe dva vlákna jeden hlavný závit a druhý podriadený závit vytvorený hlavným vláknom. Vykonanie obidvoch závitov sa vyskytuje súčasne, ale presný výstup nie je možné predstierať.

Definícia spustiteľného rozhrania

Runnable je rozhranie v balíku java.lang . Implementáciou rozhrania Runnable môžeme definovať vlákno. Spustiteľné rozhranie má jednu metódu run (), ktorú implementuje trieda, ktorá implementuje rozhranie Runnable. Ak sa rozhodnete definovať vlákno implementujúce rozhranie Runnable, stále máte možnosť rozšíriť akúkoľvek inú triedu. Pri vytváraní viacerých vlákien implementáciou rozhrania Runnable, každý vlákno zdieľa rovnakú inštanciu, ktorá sa dá spustiť. Naučme sa, ako definovať vlákno pomocou rozhrania Runnable.

 / * Definovanie vlákna * / Trieda Runnablethread implementuje Runnable {/ * úloha vlákna * / verejné void run () {pre (int i = 0; i <10; i ++) {System.Out.Println ); }} Trieda mainThread {/ * úloha hlavného vlákna * / public static void main (String args []) {Mythread rt = nový Mythread (); / * hlavný vlákno vytvoril objekt spustiteľný * / Thread t = nový Thread (rt); / * hlavné vlákno vytvára podproces podriadený a prešiel spustiteľný objekt * / t.start (); pre (int i = 0; i <10; i ++) {System.Out.Print ("Hlavný závit"); }}} / * Výstup * / Hlavný závit Hlavný závit Hlavný závit Hlavný závit Detský závit Detský závit Detský závit Detský závit Detský závit Hlavný závit Detský závit Hlavný závit Hlavný závit Detský závit Detský závit Hlavný závit Hlavný závit Detský závit Detský závit Hlavný závit 

V uvedenom kóde som vytvoril triedu Runnablethread, ktorá implementuje rozhranie Runnable a definuje úlohu vlákna zavedením metódy run () rozhrania Runnable. Potom vytvorím triedu mainthread obsahujúcu hlavnú metódu. V rámci hlavnej metódy som deklaroval spustiteľný objekt triedy Runnablethread a odovzdal tento objekt konštruktoru vlákna pri vyhlásení vlákna. Týmto spôsobom som prepojil objekt vlákna (t) s objektom spustiteľným (rt). Následne objekt nite vyvolá metódu začiatku vlákna, ktorá ďalej vyvolá metódu spustenia triedy Runnablethread. Ak by som nemal prepojený objekt s objektom Thread, potom metóda spustenia vlákien by vyvolala metódu spustenia triedy Thread. Teraz znova existujú dve vlákna v kóde, hlavné vlákno a hlavné vlákno vytvára podriadený závit, obaja sa vykonajú súčasne, ale presný výstup sa nikdy nedá predstierať.

Kľúčové rozdiely medzi vláknom a spustiteľným v jazyku Java

  1. Každé vlákno vytvorené rozšírením triedy Thread vytvorí pre neho jedinečný objekt a priradí sa k tomuto objektu. Na druhej strane každé vlákno vytvorené implementáciou rozhrania Runnable zdieľa rovnakú inštanciu.
  2. Keďže každý podproces je spojený s jedinečným objektom vytvoreným rozšírením triedy Thread, vyžaduje sa viac pamäte. Na druhej strane každé vlákno vytvorené implementáciou rozhrania rozhrania Runnable zdieľa rovnaký objektový priestor, preto vyžaduje menej pamäte.
  3. Ak rozšírite triedu Thread ďalej, môžete dediť akúkoľvek inú triedu, pretože Java neumožňuje viacnásobné dedičstvo, zatiaľ čo implementácia programu Runnable ešte poskytuje šancu, aby trieda mohla zdediť inú triedu.
  4. Treba rozšíriť triedu vlákien len vtedy, ak je potrebné prepísať alebo špecializovať niektoré ďalšie metódy triedy Thread. Ak chcete špecializovať iba na metódu spustenia, musíte implementovať rozhranie Runnable.
  5. Rozšírenie triedy Thread zavádza tesné spojenie v kóde ako kód vlákna a úloha vlákna je obsiahnutá v rovnakej triede. Na druhej strane implementácia rozhrania Runnable zavádza voľné spojenie v kóde, pretože kód z vlákna sa oddeľuje od úlohy priradenej vláknu.

záver:

Je výhodné implementovať rozhranie Runnable namiesto rozšírenia triedy Thread. Ako implementácia Runnable je váš kód voľne spojený, pretože kód vlákna sa líši od triedy, ktorý priradí úlohu vlákne. Vyžaduje menej pamäti a tiež umožňuje triede dediť akúkoľvek inú triedu.

Top