У меня есть управляемый объект A, который обменивается сердечными биениями с сервером при создании экземпляра. Я отправляю n таких объектов в службу-исполнитель с фиксированным размером пула потоков n. Когда метод запуска встретит исключение, он вернется. Для данного случая все мои потоки встречаются с исключением и возвратом, но созданный объект остается живым и продолжает обмениваться сигналами сердечного ритма. Как пометить такие объекты для сбора мусора, чтобы они прекратили обмен сигналами сердечного ритма?Когда запущен объект мусора, собранный в ExecutorService?
class A implements Runnable {
public void run(){
try{
\\throws error
} catch(Exception e){
\\returns
}
}
public static void main(){
ExecutorService executor = Executors.newFixedThreadPool(n)
for(i = 1 to n){
A a = new A()
executor.submit(a)
}
}
}
Должен ли я поместить ожидающий вызов в конце моего основного номера и сделать возврат?
Редактировать:
постановка вопроса другой путь, один из способов прекратить ExecutorService после того, как все потоки возвращают будет вызывать отключение() после того как цикл и вызвать awaitTermination с Integer.MAX длинных секунд, что примерно 70 лет (это временное ограничение, которое я неохотно налагаю). Есть ли другая альтернатива?
Я думаю, вы должны разместить код, который вы использовали для обмена биением сердца сигналы. – AmjadD
Сердечный звонок не является явным, он создается через библиотеку. – ankshah
Если вы все еще видите сердечные сокращения после завершения метода 'run()', у вас все еще есть «Runnable», который не вышел, даже если вы считаете, что у всех их есть *. Я предлагаю регистрировать идентификатор потока как самый первый шаг в 'run()', а также непосредственно перед каждым оператором return. Используйте 'Thread.currentThread(). GetId()'. – kdgregory