Anbefalet, 2024

Redaktørens Valg

Forskel mellem trådklasse og Runnable Interface i Java

En tråd kan defineres på to måder. For det første ved at udvide en trådklasse, der allerede har implementeret en Runnable-grænseflade. For det andet ved direkte at implementere en Runnable-grænseflade . Når du definerer en tråd ved at udvide trådklasse, skal du tilsidesætte metoden run () i trådklasse. Når du definerer en tråd, der implementerer en Runnable-grænseflade, skal du implementere den eneste run () -metode for Runnable-grænsefladen. Den grundlæggende forskel mellem Thread og Runnable er, at hver tråd defineret ved at udvide Thread-klassen opretter en unik objekt og får forbindelse til den pågældende genstand. På den anden side deler hver tråd defineret ved implementering af Runnable-grænseflade det samme objekt.

Lad os observere nogle andre forskelle mellem Thread og Runnable ved hjælp af sammenligning diagrammet vist nedenfor:

Sammenligningstabel

Grundlag for sammenligningTrådRunnable
GrundlæggendeHver tråd skaber en unik objekt og bliver forbundet med den.Flere tråde deler de samme objekter.
HukommelseDa hver tråd opretter en unik objekt, kræves der mere hukommelse.Da flere tråde deler det samme objekt, bruges mindre hukommelse.
UdvidelseI 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.
BrugEn 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.
KoblingUdvidet trådklasse introducerer tæt kobling, da klassen indeholder kode for trådklasse og også jobbet tildelt til trådenImplementering 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Top