Posiadam działający obiekt A, który wymienia sygnały bicia serca z serwerem podczas tworzenia instancji. Przesyłam n takich obiektów do usługi executora z ustalonym rozmiarem puli wątków n. Gdy metoda run napotka wyjątek, zwróci. Dla danego przypadku wszystkie moje wątki napotykają wyjątek i powrót, ale utworzony obiekt pozostaje żywy i nadal wymienia sygnały bicia serca. Jak oznaczyć takie obiekty do zbierania śmieci, aby zatrzymać wymianę sygnałów bicia serca?Kiedy w ExecutorService można pobierać działające śmieci obiektów?
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)
}
}
}
Czy powinienem założyć połączenie oczekujące na końcu mojej magistrali i złożyć zwrot?
Edycja:
Umieszczenie zapytania w inny sposób, w jedną stronę, aby zakończyć executorservice po wszystkich nici powrotu byłoby nazwać zamknięcie() po pętli i wywołać awaitTermination z Integer.MAX długich sekund, co jest mniej 70 lat (co jest ograniczeniem czasowym, na które niechętnie się nakładam). Czy jest jakaś inna alternatywa?
myślę, że należy pisać kod, który został użyty do wymiany sygnałów heart beat. – AmjadD
Wywołanie rytmu serca nie jest jawne, odbywa się przez bibliotekę. – ankshah
Jeśli nadal widzisz bicie serca po zakończeniu metody 'run()', to nadal masz 'Runnable', który nie został zakończony, * nawet jeśli uważasz, że wszyscy mają *. Sugeruję logowanie ID wątku jako pierwszego kroku 'run()', a także tuż przed każdym poleceniem return. Użyj 'Thread.currentThread(). GetId()'. – kdgregory