Promatrajmo neke druge razlike između Thread i Runnable uz pomoć usporednog grafikona prikazanog u nastavku:
Tablica usporedbe
Osnova za usporedbu | Nit | Runnable |
---|---|---|
Osnovni, temeljni | Svaka nit stvara jedinstveni objekt i pridružuje mu se. | Više niti dijeli iste objekte. |
Memorija | Kako svaka nit stvara jedinstveni objekt, potrebno je više memorije. | Budući da više niti dijeli isti objekt, koristi se manje memorije. |
Produljenje | U 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. |
Koristiti | Korisnik 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. |
spojka | Proširenje Thread klasa uvodi zbijeno spajanje kao klasa sadrži kod Thread klase i posao dodijeljen nit | Implementacija 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
- 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.
- 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.
- 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.
- 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.
- 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.