Как мне получить доступ к членам класса в хуках beforeExecute и afterExecute в ThreadPoolExecutor?

Я расширяю класс ThreadPoolExecutor. Внутри него я хочу установить значение члена в beforeExecute (Thread t, Runnable r) и afterExecute (Runnable r, Throwable t). Я не уверен, как это сделать. Может ли кто-нибудь помочь мне с этим?


person user1150989    schedule 24.04.2014    source источник


Ответы (1)


Предположительно, вы хотите получить доступ к полю экземпляра ваших Runnable экземпляров. Чтобы получить к ним доступ, вам нужно будет преобразовать Runnable в фактический класс вашего класса Runnable, а затем получить доступ к полям через ссылку вниз. Или, что еще лучше, сделайте поля приватными и получайте к ним доступ через вызовы getter/setter по ссылке.

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

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

person Stephen C    schedule 24.04.2014
comment
Я наткнулся на ваш пост в поисках решения, но это не работает. Аргумент Runnable для beforeExecute и afterExecute на самом деле представляет собой java.util.concurrent.FutureTask, который нельзя привести к моей реализации Runnable. Я использую Java 7, поэтому я не знаю, был ли изменен ThreadPoolExecutor после вашего сообщения. Возможно, это и есть причина того, что он не работает. - person Chris Hinshaw; 02.08.2014
comment
Я столкнулся с точно такой же проблемой. У меня есть собственный класс, который реализует Runnable. Я подумал, что beforeExecute() будет хорошей точкой для уведомления слушателя о том, что мой runnable начинает свое выполнение. - person sockeqwe; 15.08.2014