Я знаю некоторые подробности относительно AbstractQueuedSynchronizer. Это структура для создания зависимых от состояния классов или синхронизатора. Но я не хочу расширять этот класс в Worker ThreadPoolExecutor.
private final class Worker extends AbstractQueuedSynchronizer implements Runnable
Как видно подписью работника класса следующие вещи можно сделать вывод:
Когда новый Runnable/Callable задача представляется, новый объект Worker создается.
Новый объект Работника можно рассматривать как новую тему.
addWorker()
метод добавит нового рабочего (или просто задачу) и вызовет сам по себеworker.start()
, чтобы начать поток.класса Worker не является статическим вложенным классом, следовательно, он может получить доступ ко всем переменному ThreadPoolExecutor
run()
метод класса Worker внутренне называет runWorker (это)общественного недействительным запуска() { runWorker (это); }
runWorker()
выполняет фактическую задачу что-то вроде этого:void runWorker(Worker w) { try { w.lock(); w.firstTask.run() } finally { w.unlock(); } }
AQS используется только для этого замка и разблокировка runWorker() метод. Не можете ли мы взять ReentrantLock здесь и оставить класс Worker простым?
Также класс предоставить документацию относительно этого, но я не могу понять, что:
Этот класс оппортунистически расширяет AbstractQueuedSynchronizer для упрощения получения и снятия блокировки, окружающую каждую задачу выполнения. Это защищает от прерываний, которые предназначены для пробуждения рабочего потока, ожидающего выполнения задачи, вместо прерывания задачи . Мы реализуем простой резервный блокирующий блокировку исключения вместо использования ReentrantLock, потому что мы не хотим, чтобы рабочие задачи могли восстановить блокировку при вызове методов управления пулами , как setCorePoolSize.
Пожалуйста, помогите