Jakie są zalety / powody korzystania z programu obsługi, a nie wątku?
Handler pozwala na wysyłanie i przetwarzania wiadomości i Runnableprzedmioty związane z wątku MessageQueue. Każda Handlerinstancja 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 ThreadPoolExecutorlub 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 AsyncTaski HandlerThreadnie jest to odpowiednie klasy. AsyncTaskJednowątkowy charakter zmieniłby całą pracę w puli wątków w system liniowy. HandlerThreadZ 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 Handlerdo uruchamiania wielu instancji Runnable. W takim przypadku wszystkie Runnablezadania będą uruchamiane w jednym wątku.
Android: Toast w wątku