Zalecane, 2020

Wybór Redakcji

Różnica między klasą wątków a interfejsem, które można uruchomić w Javie

Wątek można zdefiniować na dwa sposoby. Po pierwsze, rozszerzając klasę Thread, która już zaimplementowała interfejs Runnable. Po drugie, bezpośrednio implementując interfejs Runnable . Kiedy definiujesz wątek przez rozszerzenie klasy Thread, musisz zastąpić metodę run () w klasie Thread. Po zdefiniowaniu wątku implementującego interfejs Runnable należy zaimplementować jedyną metodę run () interfejsu Runnable. Podstawowa różnica między wątkami i Runnable polega na tym, że każdy wątek zdefiniowany przez rozszerzenie klasy Thread tworzy unikalny obiekt i zostaje powiązany z tym obiektem. Z drugiej strony każdy wątek zdefiniowany za pomocą interfejsu Runnable ma ten sam obiekt.

Przyjrzyjmy się innym różnicom między wątkiem i runnable za pomocą poniższej tabeli porównawczej:

Wykres porównania

Podstawa do porównaniaWątekRunnable
PodstawowyKażdy wątek tworzy unikalny obiekt i zostaje z nim powiązany.Wiele wątków ma te same obiekty.
PamięćPonieważ każdy wątek tworzy unikatowy obiekt, potrzeba więcej pamięci.Ponieważ wiele wątków ma ten sam obiekt, którego używa mniej pamięci.
RozsuwalnyW Javie dziedziczenie wielokrotne jest niedozwolone, dlatego po rozszerzeniu klasy Thread nie może ona rozszerzyć żadnej innej klasy.Jeśli klasa definiuje wątek implementujący interfejs Runnable, ma szansę na rozszerzenie jednej klasy.
Posługiwać sięUżytkownik musi rozszerzyć klasę wątków tylko wtedy, gdy chce zastąpić inne metody w klasie Thread.Jeśli chcesz tylko specjalizować metodę run, wówczas użycie Runnable jest lepszą opcją.
SprzęganieRozszerzenie klasy Thread wprowadza ścisłe sprzężenie, ponieważ klasa zawiera kod klasy Thread, a także zadanie przypisane do wątkuImplementacja interfejsu Runnable wprowadza luźne sprzężenie, ponieważ kod wątku jest oddzielny od zadania wątków.

Definicja klasy wątków

Wątek jest klasą w pakiecie java.lang . Klasa Thread rozszerza klasę Object i implementuje interfejsy Runnable . Klasa Thread zawiera konstruktory i metody tworzenia i działania na wątku. Gdy tworzymy wiele wątków, każdy wątek tworzy unikalny obiekt i staje się powiązany z tym obiektem. Jeśli utworzysz wątek rozszerzający klasę Thread, nie możesz rozszerzyć żadnej innej klasy, ponieważ java nie obsługuje dziedziczenia wielokrotnego. Dlatego powinieneś rozszerzyć klasę Thread tylko wtedy, gdy chcesz zastąpić inne metody klasy Thread. Zobaczmy przykład tworzenia wątku rozszerzającego klasę Thread.

 / * Definiowanie wątku * / Class Mythread extends Thread {/ * job of the thread * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Wątek potomny" ); }} Klasa mainThread {/ * zadanie głównego wątku * / public static void main (String args []) {Mythread mt = new Mythread (); / * główny wątek utworzył wątek podrzędny * / mt.start (); for (int i = 0; i <10; i ++) {System.Out.Print ("Główny wątek"); }}} / * Dane wyjściowe * / Główny wątek Główny wątek Główny wątek Główny wątek Gwint główny Gwint podstawowy Gwint podstawowy Gwint podstawowy Gwint podstawowy Gwint podstawowy Gwint główny Gwint podstawowy Gwint główny Gwint główny Gwint nić Gwint nić Gwint główny Gwint główny Gwint nić Gwint nić Gwint główny 

W powyższym kodzie utworzę klasę Mythread, która rozszerza klasę Thread i nadpisuje metodę run klasy Thread. W klasie zawierającej główną metodę tworzę obiekt wątku (mt) klasy Mythread i za pomocą obiektu wątku wywoływana jest metoda start (). Metoda start uruchamia wykonywanie wątku i jednocześnie JVM wywołuje metodę uruchamiania wątku. Teraz w programie są dwa wątki jeden wątek główny i drugi wątek potomny stworzony przez wątek główny. Wykonanie obu wątków występuje jednocześnie, ale dokładne dane wyjściowe nie mogą być udawane.

Definicja interfejsu, który można uruchomić

Runnable to interfejs w pakiecie java.lang . Implementując interfejs Runnable możemy zdefiniować wątek. Interfejs uruchamialny ma jedną metodę run (), która jest implementowana przez klasę, która implementuje interfejs Runnable. Gdy zdecydujesz się na zdefiniowanie wątku implementującego interfejs Runnable, nadal będziesz mógł wybrać dowolną inną klasę. Podczas tworzenia wielu wątków za pomocą interfejsu Runnable każdy wątek współużytkuje tę samą uruchamianą instancję. nauczmy się definiować wątek za pomocą interfejsu Runnable.

 / * Definiowanie wątku * / Klasa Runnablethread implementuje Runnable {/ * zadanie wątku * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread" ); }} Klasa mainThread {/ * zadanie głównego wątku * / public static void main (String args []) {Mythread rt = new Mythread (); / * główny wątek utworzył działający obiekt * / wątek t = nowy wątek (rt); / * wątek główny tworzy wątek potomny i przekazuje obiekt działający * / t.start (); for (int i = 0; i <10; i ++) {System.Out.Print ("Główny wątek"); }}} / * Dane wyjściowe * / Główny wątek Główny wątek Główny wątek Główny wątek Gwint główny Gwint podstawowy Gwint podstawowy Gwint podstawowy Gwint podstawowy Gwint podstawowy Gwint główny Gwint podstawowy Gwint główny Gwint główny Gwint nić Gwint nić Gwint główny Gwint główny Gwint nić Gwint nić Gwint główny 

W powyższym kodzie stworzyłem klasę Runnablethread, która implementuje interfejs Runnable i definiuje zadanie dla wątku, implementując metodę run () interfejsu Runnable. Następnie tworzę klasę mainthread zawierającą główną metodę. Wewnątrz metody głównej zadeklarowałem działający obiekt klasy Runnablethread i przekazałem ten obiekt do konstruktora wątku podczas deklarowania wątku. W ten sposób połączyłem obiekt wątku (t) z obiektem działającym (rt). Następnie obiekt wątku wywołuje metodę początkową wątku, która dodatkowo wywołuje metodę run klasy Runnablethread. Gdybym nie połączył obiektu uruchomionego z obiektem Thread, to metoda start wątków wywołałaby metodę run klasy Thread. Teraz znowu istnieją dwa wątki w kodzie, główny wątek i główny wątek powoduje, że wątek potomny jest wykonywany jednocześnie, ale dokładne dane wyjściowe nigdy nie mogą być udawane.

Kluczowe różnice między wątkami i Runnable w Javie

  1. Każdy wątek utworzony przez rozszerzenie klasy Thread tworzy unikatowy obiekt i zostaje powiązany z tym obiektem. Z drugiej strony każdy wątek utworzony przez implementację interfejsu Runable ma tę samą działającą instancję.
  2. Ponieważ każdy wątek jest powiązany z unikalnym obiektem, gdy jest tworzony przez rozszerzenie klasy Thread, wymagana jest większa ilość pamięci. Z drugiej strony, każdy wątek utworzony przez implementację interfejsu Runable umożliwia współużytkowanie tej samej przestrzeni obiektów, wymaga więc mniej pamięci.
  3. Jeśli rozszerzysz klasę Thread, a następnie dalej, możesz dziedziczyć dowolne inne klasy, ponieważ Java nie pozwala na wielokrotne dziedziczenie, podczas gdy implementacja Runnable nadal daje szansę na dziedziczenie każdej innej klasy.
  4. Trzeba rozszerzyć klasę Thread tylko wtedy, gdy ma ona zastąpić lub specjalizować inne metody klasy Thread. Musisz wdrożyć interfejs Runnable, jeśli chcesz specjalizować tylko metodę run.
  5. Rozszerzanie klasy Thread wprowadza ścisłe sprzężenie w kodzie, ponieważ kod wątku i zadanie wątku jest zawarte w tej samej klasie. Z drugiej strony implementowanie interfejsu Runnable wprowadza luźne sprzężenie w kodzie, ponieważ kod wątku jest oddzielony od zadania przypisanego do wątku.

Wniosek:

Preferowane jest implementowanie interfejsu Runnable zamiast rozszerzania klasy Thread. Jako implementacja Runnable powoduje, że twój kod jest luźno powiązany, ponieważ kod wątku różni się od klasy, która przypisuje zadanie do wątku. Wymaga mniej pamięci i pozwala klasie dziedziczyć dowolną inną klasę.

Top