Просто подумав об исходном вопросе ... который, я думаю, мы можем сделать из всех других заученных ответов, а также из важнейшего Эффективного Java Блоха , пункт 7, «Избегать финализаторов», ищет решение законного вопроса способом, не соответствующим языку Java ...:
... не было бы довольно очевидным решением сделать то, что на самом деле хочет ОП, - хранить все ваши объекты, которые должны быть сброшены, в виде «игрового автомата», на который все другие не сбрасываемые объекты имеют только ссылки через какой-то объект доступа ...
И затем, когда вам нужно «перезагрузить», вы отключаете существующий манеж и создаете новый: вся паутина объектов в манеже отбрасывается по течению, никогда не возвращается и однажды будет собрана GC.
Если какой-либо из этих объектов Closeable
(или нет, но имеет метод close
), вы можете поместить их в Bag
в манеже по мере их создания (и, возможно, открытия) и последнем действии. принадлежность, прежде чем отрезать манеж, будет проходить через все Closeables
закрывая их ...?
Код, вероятно, будет выглядеть примерно так:
accessor.getPlaypen().closeCloseables();
accessor.setPlaypen( new Playpen() );
closeCloseables
, вероятно, будет методом блокировки, возможно, включающим защелку (например, CountdownLatch
), для обработки (и ожидания в зависимости от ситуации) любого Runnables
/ Callables
в любых потоках, специфичных для Playpen
Завершается соответствующим образом, в частности в потоке JavaFX.