Будет ли TimerTask в статическом методе собирать мусор перед его выполнением? - PullRequest
0 голосов
/ 22 ноября 2018

Предположим, у меня есть статический метод, подобный этому:

public static void doSomething() {
    Timer timer = new Timer();
    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            something();
        }
    };
    timer.schedule(task, 1000);
}

Когда функция возвращается, больше нет ссылки на таймер или задачу.Возможно ли, что они будут собирать мусор до того, как задача будет запущена?Если нет, то почему?

1 Ответ

0 голосов
/ 22 ноября 2018

Ваш анонимный TimerTask экземпляр имеет ссылку на любой объект, используемый в run().Это означает, что если все объекты, используемые в run(), являются GCed, то экземпляр TimerTask также может быть GCed.

Вы можете открыть отладчик на вашем TimerTask и увидеть, что он содержит ссылки на объекты, используемые в run().

Больше информации здесь Всегда ли анонимные классы * всегда * поддерживают ссылку на свой включающий экземпляр?

Итак, вкратце: GC не будет собирать объекты, которые все еще используются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...