Jakie są zalety / powody korzystania z programu obsługi, a nie wątku?
Handler pozwala na wysyłanie i przetwarzania wiadomości i Runnable
przedmioty związane z wątku MessageQueue
. Każda Handler
instancja jest powiązana z pojedynczym wątkiem i kolejką komunikatów tego wątku.
Kiedy tworzysz nowy Handler
, jest on powiązany z wątkiem / kolejką komunikatów wątku, który go tworzy - od tego momentu będzie dostarczał komunikaty i pliki do uruchomienia do tej kolejki komunikatów i wykonywał je, gdy wychodzą z kolejki komunikatów .
Procedura obsługi ma dwa główne zastosowania:
- Aby zaplanować wykonanie komunikatów i elementów Runnables w przyszłości
- Aby umieścić w kolejce akcję, która ma być wykonana w innym wątku niż Twój własny.
Jeśli używasz wątków Java, musisz sobie z czymś poradzić samodzielnie - synchronizacją z wątkiem głównym, anulowaniem wątku itp.
Ten pojedynczy wątek nie tworzy puli wątków, chyba że używasz interfejsu API ThreadPoolExecutor
lub ExecutorService
.
(Zaczerpnięto to zapytanie z twoich komentarzy do odpowiedzi Blackbelt)
Dlaczego nie skorzystać z Executora? a nawet jeśli chciałbym do tego użyć Handlera, w jaki sposób?
Źródła: artykuł dotyczący wydajności wątków
Istnieją pewne rodzaje pracy, które można zredukować do wysoce równoległych, rozproszonych zadań. Przy ogromnej ilości pakietów roboczych tworzy to AsyncTask
i HandlerThread
nie jest to odpowiednie klasy. AsyncTask
Jednowątkowy charakter zmieniłby całą pracę w puli wątków w system liniowy. HandlerThread
Z drugiej strony korzystanie z klasy wymagałoby od programisty ręcznego zarządzania równoważeniem obciążenia między grupą wątków.
ThreadPoolExecutor to klasa pomocnicza ułatwiająca ten proces. Ta klasa zarządza tworzeniem grupy wątków, ustala ich priorytety i zarządza sposobem podziału pracy między te wątki. Wraz ze wzrostem lub spadkiem obciążenia klasa obraca się lub niszczy więcej wątków, aby dostosować się do obciążenia.
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100);
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(),
Runtime.getRuntime().availableProcessors(),
1,
TimeUnit.SECONDS,
workQueue);
Więcej informacji można znaleźć w tym artykule przewodnika dla programistów na temat tworzenia puli wątków .
Spójrz na ten post, aby zapoznać się z używaniem programu Handler
do uruchamiania wielu instancji Runnable. W takim przypadku wszystkie Runnable
zadania będą uruchamiane w jednym wątku.
Android: Toast w wątku