У меня есть контекст пружины, в которой мы имеем Runnable бобы стали выглядеть примерно так:@PreDestroy не вызывается для Runnable
public void startChildAndWait(Class type) {
BaseMyDispatcher child = appContext.getBean(type);
child.initialize(this); //The child references its parent during run method
new Thread(child).start();
synchronized(LOCK_OBJECT) {
LOCK_OBJECT.wait(someTime);
}
}
Класс BaseMyDispatcher является абстрактным классом и SampleRunnableX являются реализациями, которые с областью прототипа , базовый класс в основном имеет метод @PostConstruct и метод @PreDestroy (основная функция которого заключается в том, чтобы вызвать уведомление в LOCK_OBJECT) и, конечно, метод Run
Моя проблема заключается в том, что вызывается метод PostConstruct, но когда Метод запуска завершает объект, кажется, не уничтожен, поэтому метод PreDestroy равен n ot вызван, и я застрял в ожидании у родителя на LOCK_OBJECT
Код вызывается функцией внутри родительского Runnable (который выполняется внутри ThreadPoolExecutor и запускается (последовательно) несколькими дочерними элементами с тем же методом startChildAndWait, проходящим каждый раз, когда различного класса:
startChildAndWait(SampleRunnable1.class);
if(run2IsRequired && lastExitCode == 100) {//runIsRequired are booleans
startChildAndWait(SampleRunnable2.class);
}
if(run3IsRequired && lastExitCode == 100) {//lastExitCode is an integer
startChildAndWait(SampleRunnable3.class);
}
Так что же делать, чтобы метод PreDestroy вызывал завершение дочернего потока?
Спасибо за оба ответа, причина, по которой я пытался это сделать, - вызвать метод destroy в базовом классе и сохранить расширенный класс в чистоте (т. Е. Не помещать код завершения кода в методе запуска). Я работаю так, как надеялся –
Я решил сделать это через aspectj ... У меня есть точка вокруг выполнения метода run и может сделать для него новую аннотацию –