Używam java.util.Timer do zaplanowania zadania okresowego. W pewnym momencie chciałbym go wyłączyć i czekać na zakończenie.Oczekiwanie na zakończenie Timera w Javie
Timer.cancel() uniemożliwi uruchomienie jakichkolwiek przyszłych zadań. Jak mogę się upewnić, że jakiekolwiek zadania nie są w danej chwili uruchomione (lub czekać na nie, jeśli są?)
Mogę wprowadzić zewnętrzne mechanizmy synchronizacji, ale nie widzę, w jaki sposób mogą one pokryć wszystkie przypadki. Na przykład, jeśli zsynchronizuję się z jakimś monitorem w ramach zadania, nadal tęsknię za przypadkiem, gdy zadanie właśnie rozpoczęło wykonywanie, ale nie wziął monitora.
Jaka jest zalecana praktyka oczekiwania na wykonanie wszystkich zadań, w tym aktualnie uruchomionych zadań?
+1. Lub, jeśli z jakiegoś powodu musisz użyć 'Zegara', możesz użyć warunku (http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ Condition.html), aby zsynchronizować dwa wątki w zdarzeniu (takie jak ukończenie zaplanowanego zadania). –
Tak, pozycja 68 w Effective Java (wydanie drugie) zaleca ScheduledThreadPoolExecutor jako bardziej elastyczny zamiennik Timera. +1 za wzmiankę o tym, ponieważ poproszono o zalecane praktyki. – Jonik
Tak, naprawdę powinienem przeczytać tę książkę. – ripper234