Różnica między klasą wątków a interfejsem Runnable w Javie

Autor: Laura McKinney
Data Utworzenia: 1 Kwiecień 2021
Data Aktualizacji: 11 Móc 2024
Anonim
Różnica między klasą wątków a interfejsem Runnable w Javie - Technologia
Różnica między klasą wątków a interfejsem Runnable w Javie - Technologia

Zawartość


Wątek można zdefiniować na dwa sposoby. Po pierwsze, przez rozszerzenie klasy wątku który już zaimplementował interfejs Runnable. Po drugie, bezpośrednio implementacja interfejsu Runnable. Kiedy definiujesz wątek poprzez rozszerzenie klasy Thread, musisz przesłonić metodę run () w klasie Thread. Kiedy definiujesz wątek implementujący interfejs Runnable, musisz zaimplementować jedyną metodę run () interfejsu Runnable. Podstawowa różnica między Thread a Runnable polega na tym, że każdy wątek zdefiniowany przez rozszerzenie klasy Thread tworzy unikalny obiekt i zostaje skojarzony z tym obiektem. Z drugiej strony każdy wątek zdefiniowany przez implementację interfejsu Runnable ma ten sam obiekt.

Za pomocą poniższej tabeli porównawczej obserwujemy inne różnice między wątkiem a działaniem.

  1. Wykres porównania
  2. Definicja
  3. Kluczowe różnice
  4. Wniosek

Wykres porównania

Podstawa do porównaniaWątekRunnable
PodstawowyKażdy wątek tworzy unikalny obiekt i zostaje z nim skojarzony.Wiele wątków współdzieli te same obiekty.
Pamięć Ponieważ każdy wątek tworzy unikalny obiekt, potrzeba więcej pamięci.Ponieważ wiele wątków dzieli ten sam obiekt, zużywa się mniej pamięci.
RozsuwalnyW Javie wielokrotne dziedziczenie jest niedozwolone, dlatego po rozszerzeniu klasy klasy Thread nie może ona rozszerzyć żadnej innej klasy.Jeśli klasa zdefiniuje wątek implementujący interfejs Runnable, ma szansę na rozszerzenie jednej klasy.
Posługiwać się Użytkownik musi rozszerzyć klasę wątku tylko wtedy, gdy chce zastąpić inne metody w klasie wątków.Jeśli chcesz tylko specjalizować się w metodzie uruchamiania, lepszym rozwiązaniem jest wdrożenie Runnable.
Sprzęganie Rozszerzenie klasy wątku wprowadza ścisłe sprzężenie, ponieważ klasa zawiera kod klasy wątku, a także zadanie przypisane do wątkuImplementacja interfejsu Runnable wprowadza luźne sprzężenie, ponieważ kod wątku jest odrębny od zadania wątków.


Definicja klasy wątku

Wątek jest klasą w java.lang pakiet. Klasa Thread rozszerza Obiekt klasa i implementuje Runnable interfejsy. Klasa Thread zawiera konstruktory i metody do tworzenia i działania na wątku. Kiedy tworzymy wiele wątków, każdy wątek tworzy unikalny obiekt i zostaje skojarzony z tym obiektem. Jeśli utworzysz wątek rozszerzający klasę wątku, dalej nie możesz rozszerzyć żadnej innej klasy, ponieważ java nie obsługuje wielokrotnego dziedziczenia. Zatem powinieneś rozszerzyć klasę wątku tylko wtedy, gdy chcesz również zastąpić niektóre inne metody klasy wątku. Zobaczmy przykład tworzenia wątku rozszerzającego klasę wątku.

/ * Definiowanie wątku * / Class Mythread rozszerza zadanie wątku {/ * zadanie wątku * / public void run () {for (int i = 0; i <10; i ++) {System.Out.ln („Thread Child” ); }} Klasa mainThread {/ * zadanie głównego wątku * / public static void main (String args) {Mythread mt = new Mythread (); / * wątek główny utworzył wątek potomny * / mt.start (); for (int i = 0; i <10; i ++) {System.Out. („Główny wątek”); }}} / * Dane wyjściowe * / Główny wątek Główny wątek Główny wątek Główny wątek Dziecko wątek Dziecko wątek Dziecko wątek Dziecko wątek Dziecko wątek Główny wątek Dziecko wątek Główny wątek Główny wątek Dziecko wątek Główny wątek Główny wątek Główny wątek Główny wątek główny

W powyższym kodzie tworzę klasę Mythread, która rozszerza klasę Thread i przesłania metodę run klasy Thread. W klasie zawierającej główną metodę tworzę obiekt wątku (mt) klasy Mythread i używając obiektu wątku wywołałem metodę start (). Metoda start rozpoczyna wykonywanie wątku, a jednocześnie JVM wywołuje metodę uruchomienia wątku. Teraz w programie są dwa wątki: główny wątek i drugi wątek potomny utworzone przez główny wątek. Wykonanie obu wątków odbywa się jednocześnie, ale nie można udawać dokładnego wyniku.


Definicja interfejsu Runnable

Runnable jest interfejsem w java.lang pakiet. Implementując interfejs Runnable możemy zdefiniować wątek. Interfejs Runnable ma jedną metodę biegać(), który jest implementowany przez klasę implementującą interfejs Runnable. Gdy zdecydujesz się zdefiniować wątek implementujący interfejs Runnable, nadal będziesz mieć możliwość rozszerzenia dowolnej innej klasy. Podczas tworzenia wielu wątków przez wdrożenie interfejsu Runnable, każdy wątek ma tę samą instancję, którą można uruchomić. nauczmy się definiować wątek za pomocą interfejsu Runnable.

/ * Definiowanie wątku * / Klasa Runnablethread implementuje zadanie Runnable {/ * wątku * / public void run () {for (int i = 0; i <10; i ++) {System.Out.ln („Wątek potomny” ); }} Klasa mainThread {/ * zadanie głównego wątku * / public static void main (String args) {Mythread rt = new Mythread (); / * główny wątek utworzył uruchamialny obiekt * / Thread t = new Thread (rt); / * wątek główny tworzy wątek potomny i przekazał uruchamialny obiekt * / t.start (); for (int i = 0; i <10; i ++) {System.Out. („Główny wątek”); }}} / * Dane wyjściowe * / Główny wątek Główny wątek Główny wątek Główny wątek Dziecko wątek Dziecko wątek Dziecko wątek Dziecko wątek Dziecko wątek Główny wątek Dziecko wątek Główny wątek Główny wątek Dziecko wątek Główny wątek Główny wątek Główny wątek Główny wątek główny

W powyższym kodzie stworzyłem klasę Runnablethread, która implementuje interfejs Runnable i definiuje zadanie wątku poprzez implementację metody run () interfejsu Runnable. Następnie tworzę główny wątek klasy zawierający metodę główną. Wewnątrz głównej metody zadeklarowałem uruchamialny obiekt klasy Runnablethread i przekazałem ten obiekt do konstruktora Wątka, deklarując wątek. W ten sposób połączyłem obiekt wątku (t) z obiektem uruchamialnym (rt). Następnie obiekt wątku wywołuje metodę uruchomienia wątku, która dodatkowo wywołuje metodę uruchomienia klasy Runnablethread. Gdybym nie połączył obiektu wykonalnego z obiektem Thread, wówczas metoda uruchamiania wątków wywołałaby metodę run klasy Thread. Teraz znowu w kodzie są dwa wątki: główny wątek i główny wątek tworzą wątek potomny, oba są wykonywane jednocześnie, ale dokładne dane wyjściowe nigdy nie mogą być udawane.

Kluczowe różnice między wątkiem a Runnable w Javie

  1. Każdy wątek utworzony przez rozszerzenie klasy Thread tworzy dla niego unikalny obiekt i zostaje skojarzony z tym obiektem. Z drugiej strony każdy wątek utworzony przez implementację interfejsu Runnable ma tę samą instancję.
  2. Ponieważ każdy wątek jest powiązany z unikalnym obiektem, gdy jest tworzony przez rozszerzenie klasy wątku, potrzeba więcej pamięci. Z drugiej strony każdy wątek utworzony przez implementację interfejsu Runnable ma tę samą przestrzeń obiektową, dlatego wymaga mniej pamięci.
  3. Jeśli następnie rozszerzysz klasę wątku, możesz odziedziczyć dowolną inną klasę, ponieważ Java nie zezwala na wielokrotne dziedziczenie, podczas gdy implementacja Runnable nadal zapewnia szansę na dziedziczenie dowolnej klasy.
  4. Należy rozszerzyć klasę wątku tylko wtedy, gdy ma ona przesłonić lub specjalizować się w innych metodach klasy wątku. Musisz wdrożyć interfejs Runnable, jeśli chcesz tylko specjalizować tylko metodę uruchamiania.
  5. Rozszerzenie klasy Thread wprowadza ścisłe sprzężenie w kodzie, ponieważ kod Thread i zadanie wątku są zawarte w tej samej klasie. Z drugiej strony implementacja interfejsu Runnable wprowadza luźne sprzężenie w kodzie, ponieważ kod wątku jest oddzielony od zadania przypisanego do wątku.

Wniosek:

Preferowane jest wdrożenie interfejsu Runnable zamiast rozszerzania klasy Thread. Ponieważ implementacja Runnable powoduje, że kod jest luźno sprzężony, ponieważ kod wątku różni się od klasy przypisującej zadanie do wątku. Wymaga mniej pamięci, a także pozwala klasie odziedziczyć każdą inną klasę.