2013-08-28 17 views
14

Jakie korzyści można uzyskać, używając Executorów zamiast samych wątków w programie Java.Zalety Executorów nad nowym wątkiem

Takie jak

ExecutorService pool = Executors.newFixedThreadPool(2); 
void someMethod() { 
    //Thread 
    new Thread(new SomeRunnable()).start(); 

    //vs 

    //Executor 
    pool.execute(new SomeRunnable()); 
} 

Czy wykonawca testamentu tylko ograniczyć liczbę wątków Pozwala to mieć uruchomiony na raz (Pooling wątek)? Czy w rzeczywistości multipleksuje runnables na tworzone przez siebie wątki? Jeśli nie, to po prostu sposób na uniknięcie konieczności pisania za każdym razem nowego wątku (działającego) .start()?

+1

Czy przeczytałeś obszerną i szczegółową dokumentację? – SLaks

+4

"* w aplikacjach na dużą skalę sensowne jest oddzielenie zarządzania wątkami i tworzeniem od reszty aplikacji, a obiekty, które zawierają te funkcje, są zwane executorami. *" - [Źródło] (http: // docs. oracle.com/javase/tutorial/essential/concurrency/executors.html) – mre

+0

Nikt jeszcze nie odpowiedział "testowanie" - o wiele łatwiej (i szybciej) przetestować ze skrótem implementacji ExecutorService, która po prostu wywołuje run() na Runnable w bieżącym wątku. (Chociaż oczywiście chciałbyś przetestować także współbieżne aspekty). Inne kwestie to; wtrysk, zarządzanie pojemnikiem, konfigurowanie i monitorowanie. – earcam

Odpowiedz

7

Tak, executory będą generalnie multipleksować runnables na tworzonych wątkach; będą ograniczać i zarządzać liczbą wątków działających jednocześnie; znacznie ułatwią dostosowanie poziomów współbieżności. Ogólnie rzecz biorąc, należy preferować executorów, zamiast tylko tworzyć nieosłonięte wątki.

+0

Dzięki. To była dobra i szybka odpowiedź. Multiplexing sprzedaje to dla mnie, ogranicznik nici jest tylko lukrem. – Chase

5

Tworzenie nowych nici jest drogie. Ponieważ Executory używają puli wątków, można łatwo ponownie wykorzystać wątki, co daje lepszą wydajność.

+0

Oto kilka [figurki z piłką nożną] (http://stackoverflow.com/a/35667911/1143274) o wydatkach. Pomoże to osądzić, czy refaktoryzacja istniejącego projektu za pomocą "Nici" może dać jakąkolwiek prawdziwą lepszą wydajność lub jest stratą czasu. –

2

Czy executor ogranicza liczbę wątków, które można jednocześnie uruchomić (łączenie wątków)?

Executors#newFixedThreadPool(int), Executors#newSingleThreadExecutor to zrobić, każdy w różnych warunkach (czytaj prawidłowego javadoc wiedzieć więcej na ten temat).

Czy w rzeczywistości multipleksuje ruchy na wątki, które tworzy?

Tak

Jeśli nie jest to tylko sposób na uniknięcie konieczności napisać nowy wątek (runnable) .start() za każdym razem?

ExecutorService pomaga kontrolować sposób obsługi wątków. Oczywiście można to zrobić ręcznie, ale nie trzeba wymyślać koła. Ponadto istnieją inne funkcje, które umożliwiają wykonywanie zadań asynchronicznych za pomocą instancji .

+0

OP, należy pamiętać, że istnieje wiele różnych implementacji 'ExecutorService', z których można korzystać. –

-1

Jak już wspomniałem w a related question, wątki są dość złe. Komornicy (i związane z nimi zajęcia współbieżności) są bardzo dobre: ​​

Zastrzeżenie: tu, zdecydowanie zniechęcać do korzystania z surowców wątkach. I dużo wolę korzystanie z Callables i FutureTasks (Z javadoc: "A anulowane obliczenie asynchroniczne"). Integracja timeoutów, poprawne anulowanie i łączenie wątków nowoczesnej obsługi współbieżności są o wiele bardziej użyteczne niż stosy surowych wątków.

Na przykład, jestem obecnie zastąpienie starszych kawałek kodu, który używany jest odłączony wątkiem w pętli z samowyzwalaczem, aby określić, jak długo powinien on Thread.Sleep() po każdej iteracji. Mój zamiennik użyje bardzo prostego Runnable (do przechowywania pojedynczej iteracji), ScheduledExecutorService, aby uruchomić jedną z iteracji i Future wynikającą z metody scheduleAtAFixedRate, aby dostroić czas pomiędzy iteracjami.

Chociaż można twierdzić, że zastąpienie będzie faktycznie równoznaczne z dotychczasowym kodem, zastąpię tajemne warknięcie zarządzania wątkami i pobożne życzenia za pomocą podzielonego na kilka części zestawu funkcji, który oddziela obawy GUI (czy jesteśmy obecnie działa?) z przetwarzania danych (odtwarzanie z prędkością 5x) i zarządzania plikami (anuluj to uruchomienie i wybierz inny plik).

0

Istnieje wiele problemów związanych z wątkiem.

  • zarządzające wątki
  • wykorzystanie zasobów
  • stworzenie wątku

Komornicy zapewnia różnego rodzaju implementacji do tworzenia puli wątków. Również tworzenie wątków jest kosztowną sprawą. Executory tworzą i zarządzają tymi wątkami wewnętrznie. Szczegółowe informacje na ten temat można znaleźć w poniższym linku. http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html