Upoštevajmo nekatere druge razlike med Thread in Runnable s pomočjo primerjalne tabele, prikazane spodaj:
Primerjalna tabela
Podlaga za primerjavo | Nit | Izvedljivo |
---|---|---|
Osnovno | Vsaka nit ustvari edinstven objekt in se poveže z njim. | Več niti deli iste predmete. |
Spomin | Ker vsaka nit ustvari edinstven predmet, je potrebnega več pomnilnika. | Ker več niti deli isti predmet, se uporablja manj pomnilnika. |
Podaljšanje | V Javi večkratno dedovanje ni dovoljeno, zato po razširitvi razreda Thread ni mogoče razširiti nobenega drugega razreda. | Če razred definira nit, ki izvaja vmesnik Runnable, ima možnost razširitve enega razreda. |
Uporaba | Uporabnik mora razširiti razred nitov samo, če želi preglasiti druge metode v razredu Thread. | Če želite samo specializirati način izvajanja, potem je uporaba Runnable boljša možnost. |
Spajanje | Razširjeni razred Thread uvaja tesno povezovanje, saj razred vsebuje kodo razreda Thread in tudi opravilo, ki je dodeljeno niti | Izvajanje vmesnika Runnable uvaja ohlapno povezavo, saj je koda Thread ločena oblika opravila Threads. |
Opredelitev razreda navojev
Nit je razred v paketu java.lang . Razred Thread razširja razred Object in izvaja vmesnike Runnable . Razred Thread ima konstruktorje in metode za ustvarjanje in delovanje na niti. Ko ustvarimo več niti, vsaka nit ustvari edinstven objekt in se poveže s tem objektom. Če ustvarite razred Thread Thread Thread, ne morete razširiti nobenega drugega razreda, ker java ne podpira več dedovanja. Torej se morate odločiti za razširitev razreda Thread samo takrat, ko želite preglasiti tudi druge metode razreda Thread. Oglejmo si primer ustvarjanja niti, ki širi razred Thread.
/ * Definiranje niti * / Razred Mythread razširja Thread {/ * opravilo niti * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread") ); }} Razred mainThread {/ * opravilo glavne niti * / javno statično void main (String args []) {Mythread mt = new Mythread (); / * glavna nit je ustvarila otroško nit * / mt.start (); za (int i = 0; i <10; i ++) {System.Out.Print ("Glavna nit"); Izhod * / Glavna nit Glavna nit Glavna nit Glavna nit Otroška nit Otroška nit Otroška nit Otroška nit Glavna nit Otroška nit Glavna nit Glavna nit Glavica Nit Otroka Nit Glavna nit Glavna nit Noga Otrok Nit Glavna nit
V zgornji kodi ustvarim razred Mythread, ki razširja razred Thread in razveljavi metodo teka razreda Thread. V razredu, ki vsebuje glavno metodo, ustvarim predmet niza (mt) razreda Mythread in z uporabo objekta thread, ki je sprožil metodo start (). Metoda start zažene izvedbo niti in hkrati JVM prikliče metodo izvajanja niti. Zdaj sta v programu dve niti, ena glavna nit in druga nit, ustvarjena z glavno nitjo. Izvajanje obeh navojev poteka istočasno, vendar natančnega izhoda ni mogoče pretvarjati.
Opredelitev vgrajenega vmesnika
Runnable je vmesnik v paketu java.lang . Z uvajanjem vmesnika Runnable lahko definiramo nit. Runnable vmesnik ima en sam način run (), ki ga izvaja razred, ki izvaja Runnable vmesnik. Če izberete definiranje niti, ki izvaja vmesnik, ki ga je mogoče izvajati, imate še vedno možnost razširiti kateri koli drug razred. Ko ustvarite več niti z uporabo vmesnika Runnable, vsaka nit deli isti primer, ki ga je mogoče izvesti. Naučimo se, kako definirati nit z uporabo vmesnika Runnable.
/ * Definiranje niti * / Razred Runnablethread izvaja Runnable {/ * opravilo niti * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread") ); }} Razred mainThread {/ * opravilo glavne niti * / javne statične void main (String args []) {Mythread rt = new Mythread (); / * glavna nit je ustvarila objekt, ki ga je mogoče izvesti * / Thread t = new Thread (rt); / * glavna nit ustvari otroško nit in prenese izvedljiv objekt * / t.start (); za (int i = 0; i <10; i ++) {System.Out.Print ("Glavna nit"); Izhod * / Glavna nit Glavna nit Glavna nit Glavna nit Otroška nit Otroška nit Otroška nit Otroška nit Glavna nit Otroška nit Glavna nit Glavna nit Glavica Nit Otroka Nit Glavna nit Glavna nit Noga Otrok Nit Glavna nit
V zgornji kodi sem ustvaril razred Runnablethread, ki izvaja Runnable vmesnik in definira opravilo niti z izvajanjem metode run () vmesnika Runnable. Potem ustvarim razred mainthread, ki vsebuje glavno metodo. V glavni metodi sem razglasil objekt, ki ga je mogoče izvesti v razredu Runnablethread in ga posredoval konstruktorju Thread-a, ko je razglasil nit. Na ta način sem povezal objekt (t) niti s predmetom, ki ga je mogoče izvesti (rt). Nato objekt niti zažene metodo zagona niti, ki nadalje prikliče metodo izvajanja razreda Runnablethread. Če s predmetom Thread nisem povezal objekta, ki ga je mogoče izvesti, bi metoda metode start začela metodo izvajanja razreda Thread. Zdaj, spet obstajata dve niti v kodi, glavna nit in glavna nit ustvarjata otroški nit, ki se izvajata istočasno, vendar natančnega izhoda ne moremo nikoli pretvarjati.
Ključne razlike med nitjo in izvajanjem v Javi
- Vsaka nit, ustvarjena z razširitvijo razreda Thread, ustvari zanjo edinstven objekt in se poveže z njim. Po drugi strani ima vsaka nit, ustvarjena z uporabo vmesnika Runnable, skupen primer, ki ga je mogoče izvesti.
- Ker je vsaka nit povezana z edinstvenim predmetom, ko je ustvarjena z razširitvijo razreda Thread, je potrebnega več pomnilnika. Po drugi strani pa vsaka nit, ustvarjena z uporabo vmesnika Runnable, deli isti predmetni prostor, zato zahteva manj pomnilnika.
- Če razširite razred Thread, potem lahko podedujete kateri koli drug razred, saj Java ne dovoljuje več dedovanja, medtem ko implementacija Runnable še vedno omogoča, da razred podeduje kateri koli drug razred.
- Razred Thread je treba razširiti samo, če mora preglasiti ali specializirati druge metode razreda Thread. Vmesnik, ki ga je mogoče izvesti, morate izvesti, če želite samo specializirati način izvajanja.
- Razširitev razreda Thread uvaja tesno povezovanje v kodi, saj kodo Thread in opravilo nit vsebuje isti razred. Po drugi strani pa Implementing Runnable vmesnik uvaja ohlapno povezovanje v kodi, saj je koda Thread seprate od naloge, dodeljene niti.
Sklep:
Zaželeno je, da se namesto razširitve razreda Thread uvede vmesnik Runnable. Ko izvajamo Runnable, je vaša koda ohlapno povezana, saj je koda za nit različna od razreda, ki dodeli opravilo niti. Zahteva manj pomnilnika in omogoča razredu, da podeduje kateri koli drug razred.