Preporučeno, 2020

Izbor Urednika

Razlika između klase niti i izvršnog sučelja u Javi

Konac se može definirati na dva načina. Prvo, proširenjem Thread klase koja je već implementirala Runnable sučelje. Drugo, izravnom implementacijom Runnable sučelja . Kada definirate nit proširenjem Thread klase morate nadjačati run () metodu u Thread klasi. Kada definirate nit koja implementira Runnable sučelje, morate implementirati samo run () metodu Runnable sučelja. Osnovna razlika između Thread i Runnable je da svaka nit definirana proširenjem Thread klase stvara jedinstveni objekt i povezuje se s tim objektom. S druge strane, svaka nit definirana provedbom Runnable sučelja dijeli isti objekt.

Promatrajmo neke druge razlike između Thread i Runnable uz pomoć usporednog grafikona prikazanog u nastavku:

Tablica usporedbe

Osnova za usporedbuNitRunnable
Osnovni, temeljniSvaka nit stvara jedinstveni objekt i pridružuje mu se.Više niti dijeli iste objekte.
MemorijaKako svaka nit stvara jedinstveni objekt, potrebno je više memorije.Budući da više niti dijeli isti objekt, koristi se manje memorije.
ProduljenjeU Javi, višestruko nasljeđivanje nije dopušteno, stoga, nakon što klasa proširi klasu Thread, ona ne može proširiti nijednu drugu klasu.Ako klasa definira niti koja implementira Runnable sučelje, postoji mogućnost proširenja jedne klase.
KoristitiKorisnik mora proširiti klasu nit samo ako želi nadjačati druge metode u klasi Thread.Ako želite samo specijalizirati način izvođenja, onda je implementacija Runnable bolja opcija.
spojkaProširenje Thread klasa uvodi zbijeno spajanje kao klasa sadrži kod Thread klase i posao dodijeljen nitImplementacija Runnable sučelja uvodi labav spoj kao kod Thread je odvojen oblik posao Threads.

Definicija klase niti

Tema je klasa u java.lang paketu. Klasa Thread proširuje klasu Object i implementira sučelja koja se mogu izvesti. Klasa Thread ima konstruktore i metode za stvaranje i rad na niti. Kada stvaramo više niti, svaka nit stvara jedinstveni objekt i povezuje se s tim objektom. Ako stvorite klasu Thread koja se proširuje niti, dalje ne možete proširiti nijednu drugu klasu jer java ne podržava višestruko nasljeđivanje. Dakle, trebali biste odabrati proširenje klase Thread samo kada želite i nadjačati neke druge metode Thread klase. Pogledajmo primjer stvaranja niti koja širi klasu Thread.

 / * Definiranje niti * / Klasa Mythread proteže se Thread {/ * zadatak niti * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread") ); }} Klasa mainThread {/ * zadatak glavne niti * / javne statičke nevažeće glavne (String args []) {Mythread mt = new Mythread (); / * glavna nit je kreirala podrijetlo djeteta * / mt.start (); za (int i = 0; i <10; i ++) {System.Out.Print ("Glavna nit"); Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Dijete Tema Glavna nit 

U gore navedenom kodu, kreiram klasu Mythread koja proširuje Thread klasu i nadjačava metodu rada Thread klase. U klasi koja sadrži glavnu metodu kreiram objekat niti (mt) klase Mythread i pomoću objekta thread provlači metodu start (). Metoda start pokreće izvođenje niti i istovremeno JVM poziva metodu izvođenja niti. Sada postoje dvije niti u programu jedna glavna nit i drugi dječji nit stvoren glavnom niti. Izvođenje oba navoja odvija se istovremeno, ali se točan izlaz ne može pretvarati.

Definicija sučelja koje se može izvršiti

Runnable je sučelje u java.lang paketu. Primjenom Runnable sučelja možemo definirati nit. Runnable sučelje ima jednu metodu run (), koju implementira klasa koja implementira Runnable sučelje. Kada odaberete definiranje niti implementacije Runnable sučelja, još uvijek imate izbor proširiti bilo koju drugu klasu. Kada stvorite više niti implementirajući sučelje koje se može izvesti, svaka nit dijeli istu instancu koja se može izvesti. naučimo kako definirati nit pomoću Runnable sučelja.

 / * Definiranje niti * / Klasa Runnablethread implementira Runnable {/ * zadatak niti * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread") ); }} Klasa mainThread {/ * zadatak glavne niti * / javne statičke nevažeće glavne (String args []) {Mythread rt = new Mythread (); / * glavna nit je stvorila objekat koji se može izvršiti * / Thread t = new Thread (rt); / * glavna nit kreira nit djeteta i prosljeđuje objekat koji se može izvršiti * / t.start (); za (int i = 0; i <10; i ++) {System.Out.Print ("Glavna nit"); Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Glavna nit Dijete Tema Glavna nit 

U gornjem kodu sam stvorio klasu Runnablethread koja implementira Runnable sučelje i definira posao niti implementiranjem metode run () sučelja Runnable. Tada sam stvorio klasu mainthread koji sadrži glavnu metodu. Unutar glavne metode, proglasio sam objekat koji se može izvesti u klasi Runnablethread i proslijedio taj objekt konstruktoru Thread-a dok je objavljivao nit. Na taj sam način povezao objekt konca (t) s objektom koji se može izvesti (rt). Tada objekt niti dovodi start metodu niti koja dalje poziva metodu izvođenja klase Runnablethread. Ako nisam povezao objekat koji se može izvesti s objektom Thread, metoda starta niti bi se pozvala na metodu izvođenja klase Thread. Sada, opet postoje dvije niti u kodu, glavna nit i glavna nit stvara dijete nit i dobiti izvršiti istovremeno, ali točan izlaz nikada ne može se pretvarati.

Ključne razlike između teme i izvršne u Javi

  1. Svaka nit stvorena proširenjem Thread klase stvara jedinstveni objekt za nju i povezuje se s tim objektom. S druge strane, svaka nit stvorena implementacijom sučelja koje se može izvršiti dijeli istu instancu koja se može izvesti.
  2. Budući da je svaka nit povezana s jedinstvenim objektom kada je stvorena proširenjem Thread klase, potrebno je više memorije. S druge strane, svaka nit stvorena primjenom Runnable sučelja dijeli isti prostor objekta, stoga zahtijeva manje memorije.
  3. Ako dalje proširite klasu Thread, možete naslijediti bilo koju drugu klasu jer Java ne dopušta višestruko nasljeđivanje, dok implementiranje Runnablea još uvijek pruža priliku klasi da naslijedi bilo koju drugu klasu.
  4. Potrebno je proširiti klasu Thread samo ako mora nadjačati ili specijalizirati neke druge metode Thread klase. Morate implementirati sučelje koje se može izvesti ako želite samo specijalizirati način izvođenja.
  5. Proširivanje Thread klase uvodi usku vezu u kodu kao što je kod Thread i posao nit sadržan u istoj klasi. S druge strane, Implementing Runnable sučelje uvodi labav spoj u kodu kao kod Thread je seprate od posla dodijeljen nit.

Zaključak:

Poželjno je implementirati Runnable sučelje umjesto proširenja Thread klase. Kao implementacija Runnable čini vaš kod labavo spojen kao kod niti je različit od klase koja dodijeliti posao nit. Potrebno je manje memorije i također omogućuje klasi da naslijedi bilo koju drugu klasu.

Top