2015-04-22 3 views
5

Во внутренней реализации AsyncTask (в Android SDK) here, sDefaultExecutor объявляются с ключевым словом volatile, а также execute() метода SerialExecutor объявлен с ключевым словом synchonized.Летучие и синхронизированы в AsyncTask

  1. Теперь, поскольку AsyncTask может быть выполнен только из UI потока, а также если мы выполняем экземпляр AsyncTask, мы не можем преобразование приложений же экземпляра снова, если предыдущий экземпляр не закончат выполнение. Так как же здесь могут быть случаи с несколькими потоками?
  2. Почему у SerialExecutor есть ArrayDeque? Потому что у нас может быть только одна задача. Если мы создадим новый экземпляр AsyncTask, , тогда не получим новый экземпляр ArrayDeque, снова имеющий только одну задачу, с которой нужно иметь дело?
  3. То же самое относится к случаю с ThreadPoolExecutor. Почему нужны пулы потоков , если для конкретного экземпляра AsyncTask у нас может быть только одна задача? Для этого достаточно одного потока.

ответ

2

Мы не можем повторить тот же экземпляр, если предыдущий экземпляр не завершил выполнение. Итак, как же здесь могут быть случаи с несколькими потоками?

Существует, например, основной поток пользовательского интерфейса и потоки исполнителей.

Почему у SerialExecutor есть ArrayDeque? Потому что в то время у нас может быть только одна задача. Если мы создадим новый экземпляр AsyncTask, тогда не получим новый экземпляр ArrayDeque, который снова будет иметь только одну задачу?

Неверно, что может быть только одна задача. Последовательный исполнитель может выполнять только одну задачу за раз, но вы можете ставить в очередь несколько задач в основном потоке, и они выполняются один за другим в потоке исполнителей.

Есть и другие исполнители, кроме последовательного исполнителя, также как и исполнитель пула потоков, о котором вы упоминаете позже.

То же самое происходит с ThreadPoolExecutor. Почему пулы потоков необходимы, когда для конкретного экземпляра AsyncTask у нас может быть только одна задача? Для этого достаточно одного потока.

Неверная посылка только одной задачи за раз. Исполнитель пула потоков полезен для одновременного запуска нескольких задач async в отдельных потоках.

Как происходит очередность таков и множество задач? Предположим, что я делаю экземпляр AsyncTask и выполняю его 5 раз. Тогда, если вы работаете, другие 4 не будут запускаться. Как я могу получить несколько задач в любом случае?

Вы можете выполнить один экземпляр AsyncTask только один раз. Но вы можете отправить несколько разных экземпляров AsyncTask для выполнения.Обратите внимание, что такая операция проводки (execute() и т. Д.) Является асинхронной и возвращается до завершения задачи async, и вы можете запускать дополнительный код в потоке пользовательского интерфейса, включая отправку новых задач async для выполнения.

Для параллельного выполнения просто используйте executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ...).

Действительно ли это так, что поскольку SerialExecutor является статичным, то только один экземпляр его будет использоваться во всех экземплярах AsyncTask и, следовательно, требуется очередь?

Да, в вашем приложении есть только один последовательный исполнитель, и он делится между всеми асинхронными задачами.

+0

Как происходит очередность таков и множество задач? Предположим, что я делаю экземпляр AsyncTask и выполняю его 5 раз. Тогда, если вы работаете, другие 4 не будут запускаться. Как я могу получить несколько задач в любом случае? – Diffy

+0

Хорошо. Верно ли также, что поскольку SerialExecutor является статическим, так что только один экземпляр его будет использоваться во всех экземплярах AsyncTask и, следовательно, требуется очередь? – Diffy

Смежные вопросы