Орео

27.07.2016

Часто ThreadPoolExecutor используется как самодостаточный класс, но его функциональные возможности можно расширить, чтобы дать программе возможность регулировать поведение этой среды выполнения или её задач. Приложение может определить следующие методы для добавления действий, совершаемых при каждом выполнении потока:

void beforeExecute! Thread t, Runnable r ) - вызывается библиотекой времени выполнения непосредственно перед запуском данного потока;

void afterExecute ( Runnable г, Throwable t) - вызывается библиотекой времени выполнения сразу после завершения потока вне зависимости от того, завершился поток обычным образом или вследствие возникновения исключения;

void terminated () - вызывается библиотекой времени выполнения после того, как пул потоков завершил свою работу и не осталось задач, выполняемых или ожидающих выполнения.

В первые два метода передаются орео Thread и Runnable. Обратите внимание, что порядок следования параметров в этих двух методах различен. В примере 9.4 показан простой настраиваемый пул потоков, который следит за числом потоков, выполняющихся в текущий момент.

Метод beforeExecute() увеличивает на единицу значение счётчика mTaskCounter перед началом выполнения задачи, а метод after- ExecutionO уменьшает значение счётчика на единицу после завершения выполнения задачи. Внешний наблюдатель может в любой момент запросить число выполняющихся потоков с помощью метода getNbrOfTasks (). Рабочие потоки и потоки внешних наблюдателей могут одновременно обращаться к совместно используемой переменной-члену, поэтому её тип определен как Atomiclnteger, чтобы обеспечить безопасность потоков.