Надо ли удалять объект Runnable()?

223
06 апреля 2018, 19:34

Есть метод с кодом

SomeActivity.runOnUiThread(new Runnable()
{
    public void run()
    {
    ........
    }
});

Не ясно следующее: что происходит с объектом класса Runnable(), который создаётся в new. Точнее, когда он удаляется, и удаляется ли вообще до завершения приложения? Если это описано в документации, просьба дать ссылку. Я не смог найти.

Answer 1

В Java объекты удаляются сборщиком мусора, если на них никто не ссылается. Разберёмся кто и когда ссылается на ваш Runnable.

Внутри потока пользовательского интерфейса крутится Looper. Грубо говоря, это бесконечный цикл, на каждой итерации достающий и обрабатывающий сообщения из MessageQueue. Когда ваш поток вызывает метод runOnUiThread, переданный в этот метод Runnable добавляется в очередь. Пока Runnable находится в очереди, она хранит на него ссылку. В какой-то момент, Looper извлекает Runnable из очереди и сохраняет в локальной переменной. Теперь Looper хранит ссылку на Runnable. Looper вызывает метод run и ждёт его завершения. После завершения этого метода, Looper начнёт новую итерацию, уничтожив все локальные переменные, в том числе ссылку на Runnable. При следующем запуске сборщик мусора обнаружит, что на этот Runnable нет ссылок и уничтожит его.

READ ALSO
Spring-Integration and Threads. TaskExecutor

Spring-Integration and Threads. TaskExecutor

Заполняю очередь 10-ю сообщениями, начинаю их считывать 10-ю потокамиВ идеале эти 10 сообщений я и должен получить обратно, но вместо этого получаю...

295
java интеграция с ip телефонией

java интеграция с ip телефонией

Разрабатываем проект с использованием Spring bootТребуется реализовать интеграция с IP телефонией, чтобы оператор мог звонить клиенту и наоборот

210
В чём отличие LIst<? extends NameClass>, перед List<NameClass>

В чём отличие LIst<? extends NameClass>, перед List<NameClass>

В чём отличие (1) List<? extends NameClass>, перед (2) List<NameClass>?

224
JavaFX, Не работает KeyCode

JavaFX, Не работает KeyCode

Есть такой код, но почему то, он не срабатывает при нажатии "(" Хотя все отлично работает на цифрах, буквах, и даже если взять квадратную скобку,...

242