Примечания к чтению «Android Advanced Light» 3

Синхронизация потоков:

Синхронизированное ключевое слово: предотвращает одновременное выполнение нескольких потоков.

Ключевое слово volatile: общая переменная изменяется, чтобы указать, что, когда поток изменяет значение переменной, новое значение немедленно становится видимым для других потоков.

        Условия использования: 1. Операция записи в переменную не зависит от текущего значения

                          2. Переменная не входит в инварианты других переменных

Когда оператор содержит несколько операций, это не атомарная операция (только простое присваивание чтения)

Очередь блокировки:

Обычно используется в сценариях производитель-потребитель, производитель: поток, который добавляет элементы в очередь; потребитель: поток, который извлекает элементы из очереди.

Для распространенных сценариев блокировки поддерживаются очереди блокировки:

        1. Когда в очереди нет данных, все потоки на стороне потребителя будут автоматически заблокированы до тех пор, пока данные не будут помещены в очередь.

        2. Когда данные в очереди не заполнены, все данные на стороне производителя будут автоматически заблокированы до тех пор, пока в очереди не появится пустая позиция.

Основной метод блокировки очереди:

положить в:

offer(object) -- добавить объект в очередь блокировки, если его можно добавить, вернуть true, иначе вернуть false (не блокировать поток текущего метода)

offer(E o, long timeout, TimeUnit unit) -- Установите время ожидания, если вы не можете добавить его в очередь в течение указанного времени, вы пожалеете и потерпите неудачу

put(object) -- добавить объект в очередь, если нет места, поток, вызывающий этот метод, будет заблокирован до тех пор, пока не останется места для продолжения

Получать:

poll(long timeout, TimeUnit unit) -- удалить первый элемент в очереди, немедленно вернуться, если он может быть извлечен, в противном случае вернуть ошибку, если время ожидания еще не истекло

take() -- вынуть первый элемент очереди, если он пустой, войти в состояние ожидания, пока он не станет пустым

DrainTo() — получает все доступные объекты данных из очереди за один раз, без необходимости блокировать или снимать блокировки пакетами несколько раз.

7 блокирующих очередей Java:

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

LinkedArrayBlockingQueue: ограниченная очередь блокировки, состоящая из структуры связанного списка. Когда производитель помещает данные в очередь, очередь получает их от производителя. Только когда буфер очереди достигает максимального значения, очередь производителя блокируется до тех пор, пока потребитель не получит из очереди.Только после использования потока производителя данных он может возобновить работу. Преимущества: может эффективно обрабатывать параллельные данные

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

DelayQueue: неограниченная блокирующая очередь, которая поддерживает отложенное получение элементов.Вы можете указать время истечения срока действия элементов, и только когда срок их действия истечет, они могут быть удалены из очереди.

SynchronizedQueue: блокирующая очередь, в которой не хранятся элементы, и внутри очереди нет элементов.

LinkedTransferQueue: неограниченная очередь блокировки, состоящая из связанных списков.

LinkedBlockingQueue: двусторонняя очередь блокировки, состоящая из связанных списков, с дополнительными методами, такими как addFirst, addLast, offerFirst, offerLast и т. д.

Пул потоков:

corePoolSize: количество основных потоков

maxPoolSize: максимальное количество потоков, при превышении которых будут созданы новые потоки.

keepAliveTime: тайм-аут простоя неосновных потоков. Если это событие превышено, неосновные потоки будут перезапущены. Если для параметра allowCoreThreadTimeOut установлено значение true, keepAliveTime также будет применяться к основным потокам.

TimeUnit: единица измерения времени keepAliveTime, которая может быть ДНЯМИ, ЧАСАМИ, МИНУТАМИ, СЕКУНДами, МИЛЛИСЕКУНДами.

workQueue: если текущее количество потоков больше, чем corePoolSize, добавьте эту задачу в очередь задач.

threadFactory: фабрика потоков, обычно нет необходимости устанавливать параметры

RejectedExecutionHandler: стратегия насыщения, когда очередь задач и пул потоков заполнены, новые задачи не могут быть обработаны по умолчанию, и создается исключение.

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

Поток обработки пула потоков:

        1. Поток сначала оценивает, достигает ли количество потоков количества основных потоков, и если нет, создает основной поток для обработки задачи.

        2. Затем пул потоков определяет, заполнена ли очередь задач, если нет, то добавляет задачу в очередь задач.

        3. Очередь задач заполнена, и пул потоков оценивает, достигло ли количество потоков максимального количества потоков, если нет, создайте неосновной поток для обработки задачи, в противном случае выполните стратегию насыщения.

Типы пулов потоков:

1. FixedThreadPool: только основные потоки, количество фиксировано.

2. CachedThreadPool: corePoolSize=0, maxPoolSize=Integer.MAX_VALUE, необходимо создать пул потоков, без основных потоков, больше подходит для большого количества задач, которые необходимо обрабатывать немедленно и потреблять меньше времени

3. SingleThreadExecutor: corePoolSize=maxPoolSize=1, что может гарантировать последовательное выполнение всех задач в одном потоке.

4.ScheduledThreadPool: пул потоков для временных и периодических задач, corePoolSize является фиксированным значением, параметр maxPoolSize недействителен.

Принцип AsyncTask:

Справочная информация: когда несколько задач обновляют пользовательский интерфейс, код будет раздуваться.AsyncTask делает асинхронные задачи очень простыми.

Особенности: Это абстрактный универсальный класс.

public abstract class AsyncTask<Params, Progress, Result>{
    ...
}

Params: тип параметра; Progress: тип хода выполнения фоновой задачи; Result: тип возвращаемого результата.

4 основных метода:

        1. onPreExecute(): выполняется в основном потоке, как правило, это подготовительная работа перед выполнением задачи.

        2. doInBackground(Params): обычно используется для выполнения трудоемких операций, вы можете вызвать publishProgress() для обновления индикатора выполнения во время процесса.

        3. onProgressUpdate(Progress): выполняется в основном потоке, при вызове publishProgress прогресс будет обновляться в пользовательском интерфейсе.

        4. onPostExecute(Result): завершающая работа после выполнения фоновой задачи, например, обновление пользовательского интерфейса и данных и т. д.

Supongo que te gusta

Origin blog.csdn.net/LYFly0016/article/details/131359470
Recomendado
Clasificación