Які переваги / причини використовувати обробник, а не нитку?
Handler дозволяє передавати і обробляти повідомлення і Runnable
об'єкти , пов'язані з потоку MessageQueue
. Кожен Handler
екземпляр асоціюється з одним потоком і чергою повідомлення цього потоку.
Коли ви створюєте нове Handler
, він прив'язується до черги / черги повідомлень потоку, який його створює - з цього моменту він доставлятиме повідомлення та запущені до цієї черги повідомлення та виконує їх, коли вони виходять з черги повідомлень. .
Для обробника є два основних напрямки використання:
- Запланувати повідомлення та Runnables, які слід виконати як деякий момент у майбутньому
- Щоб епдіеее дію , яка виконуватиметься в іншому потоці , ніж свій власний.
Якщо ви використовуєте Java-нитки, вам доведеться самостійно обробляти щось - синхронізація з основною ниткою, скасування потоку тощо.
Цей єдиний потік не створює пул потоків, якщо ви не використовуєте ThreadPoolExecutor
або ExecutorService
API.
(Взятий цей запит з ваших коментарів до відповіді Blackbelt)
Чому б не використовувати Виконавця? і навіть якщо я хотів використовувати для цього обробник, як?
Довідка: Стаття про виконання теми
Існують певні види роботи, які можна звести до високопаралельних, розподілених завдань. Завдяки чистому обсягу робочих пакетів це створює AsyncTask
і HandlerThread
не є відповідними класами. Однопоточний характер AsyncTask
перетворив би всю роботу з нитками в лінійну систему. HandlerThread
З іншого боку, використання класу вимагатиме від програміста вручну керувати балансуванням навантаження між групою потоків.
ThreadPoolExecutor - це клас-помічник для полегшення цього процесу. Цей клас управляє створенням групи потоків, встановлює їхні пріоритети та керує розподілом роботи між цими потоками. Зі збільшенням або зменшенням робочого навантаження клас розкручується або знищує більше ниток, щоб підлаштовуватися під навантаження.
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
Ви можете ознайомитись з цією статтею керівництва для розробників у create-threadpool для отримання більш детальної інформації.
Перегляньте цю публікацію для використання Handler
декількох екземплярів Runnable. У цьому випадку всі Runnable
завдання виконуватимуться в одній темі.
Android: Тост в нитці