2013-05-10 8 views
6

Próbuję dowiedzieć się, jakie są możliwe zalety rozszerzenia klasy Thread?Jaka jest główna zaleta rozszerzenia klasy Thread (lub kiedy przedłużyć wątek zamiast działającego narzędzia)

Jest częścią innego pytania, które opiszę: Jest dwukierunkowy tworzenia wątków w Javie

  1. rozciągający się od klasy Thread
  2. wdrożenie runnable interfejs

Jak expalined here Istnieje kilka korzyści z używania działającego interfejsu. Moje pytanie brzmi: jaka jest korzyść z rozszerzenia klasy Thread? Jedyną zaletą, która przychodzi mi do głowy jest to, że można rozszerzyć z klasy Thread, i powiedzmy nazwij ją klasą ThreadExtended. Następnie może dodać więcej funkcji w ThreadExtended (którego nie wiem, co to może być), a następnie, gdy chce utworzyć wątek, zamiast rozszerzać z klasy Thread, rozciąga się od ThreadExtended.

Czy są jakieś zalety w korzystaniu z klasy Thread zamiast interfejsu Runnable? Czy znasz jakieś klasy, które rozciąga się od klasy wątku, a następnie poprosić użytkowników do rozszerzenia z tych klas, jeśli chcą mieć możliwości wielowątkowości?

public class ThreadExtended extends Thread{ 
    //override some functions || add more functionality to Thread class 
    } 

    public class MyThread extends ThreadExtended{ 
    public void run() 
    { 
    for(int i=0;i<10;i++) 
     { 
      System.out.println("Using ThreadExtended instead of Thread directly"); 
     } 
    } 

    public static void main(String args[]) 
    { 
    MyThread myThread = new MyThread(); 
    myThread.start(); 
    } 
    } 
+1

Istnieje tylko jeden sposób tworzenia wątku w java, który polega na utworzeniu "wątku" i wywołaniu na nim 'start()'. –

+0

@SotiriosDelimanolis Rozumiem, że, pytam o przedłużenie nie tworzenie wystąpień – sheidaei

+0

Proszę zwrócić uwagę na pytanie, które zadałem, jest nieco inny niż ten, który uważasz, że jest duplikatem. Dzięki – sheidaei

Odpowiedz

7

Rzadko istnieje nieodparty powód, aby przedłużyć klasę Thread. Wyobrażam sobie, że w większości przypadków skończysz, po prostu rzucając całą swoją logikę "zrób coś" do metody biegania.

Powinieneś trzymać się implementacji Runnable. Decydując się na rozszerzenie wątku, tworzysz hierarchię klasową, która prawdopodobnie jest bezsensowna i kończy się ograniczaniem twoich opcji refaktoryzacji rzeczy w przyszłości. Decydując się na implementację Runnable, nie stawiasz żadnych wymagań co do linii twórcy i możesz użyć potężnych abstrakcji, takich jak ExecutorService, aby odciąć nakrętki i śruby z fragmentem kodu. Wreszcie, preferowanie implementacji interfejsu zamiast rozszerzania klasy jest dobrą praktyką!

5

Jedynym powodem rozszerzenia Thread jest dodanie zachowania powiązanego z samym wątkiem, a nie zadanie wykonywane przez wątek.

Na przykład, jeśli wdrażasz pulę wątków (której nikt już nie powinien robić, biorąc pod uwagę java.util.concurrent), musisz zmienić zachowanie wątku, aby (1) mógł zaakceptować nową pracę i (2)) wraca do puli. W bardzo uproszczonej formie:

public void setRunnable(Runnable runnable) { 
    this.runnable = runnable; 
} 

public void run() { 
    while (true) { 
     // wait on lock 
     try { 
      this.runnable.run(); 
     } 
     catch (Throwable ex) { 
      // do something with exception 
     } 
     finally { 
      // return to pool 
     } 
    } 
} 
1

Uważam to wyraźniej rozszerzyć wątek jeśli ja również skonfigurować wątku, na przykład:

class FileReaper extends Thread { 
    FileReaper() { 
     setDaemon(true); 
     setName(getClass().getSimpleName()); 
    } 

    @Override public void run() { 
     // do something 
    } 
} 
0

Po prostu, kiedy przedłużyć wątku, który będzie jedyną klasą będziesz przedłużać z!

0

Jest to również dobry powód, aby rozszerzyć Thread - jeśli chcesz utworzyć wątku Looper:

Jest typowym przykładem realizacji wątku Looper, stosując separację przygotować() i pętli() aby utworzyć początkowy Handler do komunikacji z Looper.

Wątek interfejsu użytkownika jest wątkiem wątku, ale możesz utworzyć własny wątek wątku roboczego. Aby dowiedzieć się, jak zachowuje się na nim metoda Thread z zachowanym sposobem, zobacz moją ostatnią odpowiedź: here.

Powiązane problemy