Мне нужны разъяснения по перехватам ThreadPoolExecutor beforeExecute и afterExecute

#java #multithreading #executors

#java #многопоточность #исполнители

Вопрос:

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

Я понимаю, что класс-оболочка threadpool создает дюжину «вызываемых» задач и вызывает метод 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 в режиме отладки, скрытом в выполняемом объекте / FutureTask / callable.

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

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

Ответ №1:

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

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

Комментарии:

1. Я полагаю, он спрашивает о том, как before / afterExecute() обрабатывает вызываемые задачи вместо выполняемых?