Мне нужны пояснения по хукам ThreadpoolExecutor beforeExecute и afterExecute

Я использую в своем приложении пулы потоков. Я создал подкласс TreadPoolExecutor и переопределил методы beforeExecute, afterExecute и terminated для статистических целей.
Я также реализовал свою собственную ThreadFactory и переопределил метод newThread.

Я понимаю, что класс-оболочка пула потоков создает дюжину «вызываемых» задач и вызывает метод invokeAll для получения результатов. В каждой задаче есть интерфейсный объект. Базовый объект X реализует интерфейс и несколько раз создавал подклассы. Поэтому, когда пул потоков выполняется, он запускает дочерние элементы объекта X.

С точки зрения кода это выглядит примерно так:

the wrapper threapool class:

List<DoTask> tasks;     

tasks.add(new DoTask(new A("A"));
tasks.add(new DoTask(new B("B"));
tasks.add(new DoTask(new C("C"));

results = threadpool.invokeAll(tasks, 60, TimeUnit.Seconds);

in my DoTask class: public DoTask implements Callable

constructor: DoTask(ifaceX x) 

im my Base class X: public class X implements ifaceX
In my child class A, B, C: public A extends X

Мои вопросы: как получить информацию, хранящуюся в вызываемой задаче, когда я вызываю хуки до и после выполнения? или я предполагаю, что я пытаюсь дать конкретное имя каждому потоку пула потоков, возможно ли это?

Я ясно вижу, что информация находится в представлении переменных Eclipse в режиме отладки, скрытом в объекте Runnable / FutureTask / callable.

Я не понимаю, почему мне нужно только переопределить методы (beforeExecute, afterExecute) с помощью объектов Runnable, а не объектов Callable (поскольку мне нужно получить результаты). Что-то мне не хватает или я не понимаю? Может мне нужно создать подкласс FutureTask, но не уверен?

Спасибо за вашу помощь,


person Alain    schedule 06.10.2011    source источник


Ответы (1)


Было бы проще создать суперкласс DoTask, если вы хотите, чтобы что-то происходило до и после каждого вызова, вместо того, чтобы переопределять beforeExecute и afterExecute.

Изменить: Кроме того, если вы используете вызываемые объекты, вы можете использовать ExecutorService.

person ConnorWGarvey    schedule 06.10.2011
comment
Я полагаю, он спрашивает, как before / afterExecute () обрабатывать вызываемые задачи вместо выполняемых? - person Will; 10.05.2012