Выполняются ли AsyncTasks в том же фоновом потоке в SERIAL_EXECUTOR?

Вопрос о порядке выполнения AsyncTasks на Honeycomb+. Согласно документации Google:

При первом появлении AsyncTasks выполнялись последовательно в одном фоновом потоке. Начиная с DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать распространенных ошибок приложений, вызванных параллельным выполнением.

Мой вопрос: будут ли AsyncTasks, которые последовательно выполняются в фоновом режиме, также выполняться в одном потоке?

Например, будет ли AsyncTask.SERIAL_EXECUTOR, выполняющий задачи A, B и C, запустить задачу A в потоке 1, затем задачу B в потоке 1, затем задачу C в потоке 1?

Или возможно ли, что AsyncTask.SERIAL_EXECUTOR выполнит задачу A в потоке 1, затем задачу B в потоке 2, затем задачу C в потоке 3? В этой схеме все задачи выполняются последовательно, но в разных фоновых потоках.

Я спрашиваю, потому что я добавил некоторый код отладки в свой doInBackground и вижу потоки с именами AsyncTask #5, AsyncTask #4, AsyncTask #2 и AsyncTask #3, хотя я предполагал, что каждый раз буду видеть один поток с именем «AsyncTask Worker» или что-то в этом роде.

(Я просто хочу подтвердить свою собственную ментальную модель того, как должны работать AsyncTasks; я не сообщаю об ошибке или проблеме в этом вопросе.)

Спасибо!


person esilver    schedule 20.01.2016    source источник
comment
будут ли AsyncTasks, которые последовательно выполняются в фоновом режиме, также выполняться в том же потоке? -- реализация довольно странная. Вместо того, чтобы использовать пул однопоточных потоков, AsyncTask поддерживает свою собственную очередь и передает задачи в обычный пул многопоточных потоков (тот, который отображается как THREAD_POOL_EXECUTOR) по одной за раз. Следовательно, наблюдаемое вами поведение в высшей степени разумно.   -  person CommonsWare    schedule 27.01.2016
comment
Спасибо! Если вы хотите опубликовать это как ответ для меня, я буду рад сделать это!   -  person esilver    schedule 27.01.2016


Ответы (1)


будут ли AsyncTasks, которые последовательно выполняются в фоновом режиме, также выполняться в том же потоке?

Реализация довольно странно. Вместо того, чтобы использовать пул однопоточных потоков, AsyncTask поддерживает свою собственную очередь и передает задачи в обычный пул многопоточных потоков (тот, который отображается как THREAD_POOL_EXECUTOR) по одной за раз.

возможно ли, что AsyncTask.SERIAL_EXECUTOR выполнит задачу A в потоке 1, затем задачу B в потоке 2, затем задачу C в потоке 3? В этой схеме все задачи выполняются последовательно, но в разных фоновых потоках.

Это вполне возможно, если предположить, что ThreadPoolExecutor не всегда передает один и тот же поток, если пул в настоящее время не используется. Это углубляется в реализацию классов платформы Java для Android, чем я обычно. Также обратите внимание, что реализация самого ThreadPoolExecutor изменится в будущем, поскольку Android переходит на OpenJDK и отказывается от своих фреймворковых классов на основе Apache Harmony. Следовательно, я бы постарался не делать никаких предположений о том, как будет работать реализация ThreadPoolExecutor.

person CommonsWare    schedule 27.01.2016