
Lad os observere nogle andre forskelle mellem Thread og Runnable ved hjælp af sammenligning diagrammet vist nedenfor:
Sammenligningstabel
Grundlag for sammenligning | Tråd | Runnable |
---|---|---|
Grundlæggende | Hver tråd skaber en unik objekt og bliver forbundet med den. | Flere tråde deler de samme objekter. |
Hukommelse | Da hver tråd opretter en unik objekt, kræves der mere hukommelse. | Da flere tråde deler det samme objekt, bruges mindre hukommelse. |
Udvidelse | I Java er det ikke tilladt at arve flere arver, så når en klasse udvider trådklasse, kan den ikke udvide nogen anden klasse. | Hvis en klasse definerer tråd, der implementerer Runnable-grænsefladen, har den en chance for at udvide en klasse. |
Brug | En bruger skal kun udvide trådklasse, hvis den ønsker at tilsidesætte de andre metoder i trådklasse. | Hvis du kun vil specialisere løbemetode, er implementering Runnable en bedre mulighed. |
Kobling | Udvidet trådklasse introducerer tæt kobling, da klassen indeholder kode for trådklasse og også jobbet tildelt til tråden | Implementering Runnable-grænseflade introducerer løs kobling, da koden for tråd er adskilt fra jobbet af tråde. |
Definition af trådklasse
Tråd er en klasse i java.lang pakke. Thread-klassen udvider en Objeklasse, og den implementerer Runnable- grænseflader. Thread-klassen har konstruktører og metoder til at oprette og drive på tråden. Når vi opretter flere tråde, skaber hver tråd en unik objekt og får forbindelse til den pågældende genstand. Hvis du opretter en tråd, der udvider trådklassen, kan du heller ikke udvide nogen anden klasse, da java ikke understøtter flere arv. Så du bør vælge at udvide Genglass kun, når du også vil tilsidesætte nogle andre metoder til Genglass. Lad os se et eksempel på at skabe en tråd, der udvider en trådklasse.
/ * Definere en tråd * / Klasse Mythread udvider tråd {/ * job af tråden * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread" ); }} Klasse mainThread {/ * job af hovedtråd * / public static void main (String args []) {Mythread mt = new Mythread (); / * hovedtråd skabte barnetråden * / mt.start (); for (int i = 0; i <10; i ++) {System.Out.Print ("Main Thread"); }}} / * Udgang * / Hovedgarn Hovedgarn Hovedgrænse Hovedgarn Barnegreb Barnegreb Barnegreb Barnegreb Barnetråd Hovedgarn Barnetråd Hovedgarn Hovedgarn Barnetråd Barnetråd Hovedgarn Hovedgarn Barnetråd Barnetråd Hovedgarn
I koden ovenfor opretter jeg en klasse Mythread, der udvider Genglass og tilsidesætter en køremetode for Genglass. I klassen, der indeholder den vigtigste metode, opretter jeg en trådobjekt (mt) af Mythread klasse og bruger trådobjektet påkaldt start () -metoden. Startmetoden starter udførelsen af tråden og på samme tid påberåber JVM køremetoden for tråden. Nu er der to tråde i programmet, en hovedtråd og anden barnetråd skabt af hovedtråden. Udførelsen af begge trådene sker samtidigt, men det præcise output kan ikke foregå.
Definition af Runnable Interface
Runnable er en grænseflade i java.lang- pakken. Implementering Runnable interface kan vi definere en tråd. Runnable interface har en enkelt metode run (), som implementeres af den klasse, der implementerer Runnable interface. Når du vælger at definere tråd, der implementerer en Runnable-grænseflade, har du stadig mulighed for at udvide enhver anden klasse. Når du opretter flere tråde ved at implementere Runnable-grænsefladen, deler hver tråd samme runde-instans. lad os lære at definere en tråd ved hjælp af Runnable-grænsefladen.
/ * Definere en tråd * / Klasse Runnablethread implementerer Runnable {/ * job af tråden * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread" ); }} Klasse mainThread {/ * job af hovedtråd * / offentlig statisk void main (String args []) {Mythread rt = new Mythread (); / * hovedtråden skabte den runnable objekt * / Tråd t = Ny tråd (rt); / * hovedtråd skaber barnetråd og passerer det runnable objekt * / t.start (); for (int i = 0; i <10; i ++) {System.Out.Print ("Main Thread"); }}} / * Udgang * / Hovedgarn Hovedgarn Hovedgrænse Hovedgarn Barnegreb Barnegreb Barnegreb Barnegreb Barnetråd Hovedgarn Barnetråd Hovedgarn Hovedgarn Barnetråd Barnetråd Hovedgarn Hovedgarn Barnetråd Barnetråd Hovedgarn
I koden ovenfor oprettede jeg en klasse Runnablethread, der implementerer Runnable-grænsefladen og definerer jobbet af tråden ved at implementere run () -metoden i Runnable-grænsefladen. Derefter opretter jeg en klasses mainthread, der indeholder den vigtigste metode. Indenfor hovedmetoden erklærede jeg et runnable objekt af klassen Runnablethread og bestod dette objekt til trådens konstruktør mens de erklærede en tråd. På denne måde koblede jeg trådobjektet (t) med et runnable objekt (rt). Derefter påberåber trådobjektet startmetoden for tråden, som yderligere påberåber løbemetode for Runnablethread-klassen. Hvis jeg ikke havde linket runnable objekt med tråd objekt, ville tråden start metode ville have påberåbt køremetoden for tråd klasse. Nu er der igen to tråde i koden, hovedtråd og hovedtråd skaber barnetråd, begge bliver udført samtidigt, men det præcise output kan aldrig foregå.
Nøgleforskelle mellem tråd og Runnable i Java
- Hver tråd, der er oprettet ved at udvide Gruppen Thread, opretter en unik objekt til den og får forbindelse til objektet. På den anden side deler hver tråd, der oprettes ved at implementere en Runnable-grænseflade, det samme runde-eksempel.
- Da hver tråd er forbundet med et unikt objekt, når det oprettes ved at udvide trådklasse, kræves der mere hukommelse. På den anden side deler hver tråd, der er oprettet ved at implementere Runnable-grænsefladen, samme objektplads, og det kræver mindre hukommelse.
- Hvis du forlænger Thread-klassen yderligere, kan du arve nogen anden klasse, da Java ikke tillader flere arv, mens implementering af Runnable stadig giver en chance for en klasse til at arve en anden klasse.
- Man må kun udvide en trådklasse, hvis den skal tilsidesætte eller specialisere nogle andre metoder til trådklasse. Du skal implementere en Runnable-grænseflade, hvis du kun vil specialisere køremetode.
- Udvidelse af tråkklassen introducerer stram kobling i koden, da tråden og tråden er indeholdt i samme klasse. På den anden side introducerer Implementer Runnable-grænseflade løs forbindelse i koden, da koden for tråd er adskilt fra jobbet tildelt til tråden.
Konklusion:
Det foretrækkes at implementere en Runnable-grænseflade i stedet for at udvide trådklassen. Som implementering Runnable bliver din kode løst koblet, da trådens kode er forskellig fra den klasse, der tildeler job til tråden. Det kræver mindre hukommelse og giver også en klasse mulighed for at arve enhver anden klasse.