Каковы преимущества / причины использования обработчика, а не потока?
Handler позволяет передавать и обрабатывать сообщения и Runnable
объекты , связанные с потока MessageQueue
. каждыйHandler
экземпляр связан с одним потоком и очередью сообщений этого потока.
Когда вы создаете новый Handler
, он привязывается к потоку / очереди сообщений потока, который его создает - с этого момента он будет доставлять сообщения и исполняемые файлы в эту очередь сообщений и выполнять их, когда они выходят из очереди сообщений. ,
Есть два основных применения обработчика:
- Чтобы запланировать выполнение сообщений и Runnables в какой-то момент в будущем
- Чтобы поставить в очередь действие, которое будет выполняться в другом потоке, чем ваш собственный.
Если вы используете потоки Java, вам придется кое-что решать самостоятельно - синхронизацию с основным потоком, отмена потока и т. Д.
Этот единственный поток не создает пул потоков, если вы не используете API ThreadPoolExecutor
или ExecutorService
.
(Этот запрос взят из ваших комментариев к ответу Blackbelt)
Почему бы не использовать Executor? и даже если бы я хотел использовать для этого Handler, как?
Ссылка: статья о производительности потоков
Есть определенные виды работы, которые можно свести к высоко параллельным распределенным задачам. С большим объемом работы пакетов это создает, 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: тост в ветке