Когда новый поток () без ссылки будет собирать мусор - PullRequest
5 голосов
/ 20 июня 2011

В следующем примере new Thread () не имеет ссылки.Возможно ли, чтобы это был мусор, собранный ниже, он мертв?Также без расширения класса Thread или реализации runnable, как мы создаем поток?

public class TestFive {
    private int x;
    public void foo() {
            int current = x;
            x = current + 1;
    }
    public void go() {
            for(int i = 0; i < 5; i++) {
                    new Thread() {
                            public void run() {
                                    foo();
                                    System.out.print(x + ", ");
                            } 
                    }.start();
            } 
    }
    public static void main(String args[]){
            TestFive bb = new TestFive();
            bb.go();
    }
}

Ответы [ 3 ]

11 голосов
/ 20 июня 2011

Новый поток, который не был запущен, будет собирать мусор, когда он становится недоступным обычным способом.

Новый запущенный поток становится сборщиком мусора "root". Он не будет собирать мусор, пока (после) не закончится.

В следующем примере new Thread () не имеет ссылки. Возможно ли, чтобы это был мусор, собранный ниже, он мертв?

Нет. Это было начато, и, следовательно, не будет собирать мусор, пока не закончится / не умрет. И имеет доступную ссылку до (по крайней мере) точки, в которой возвращается вызов start().

Также как без расширения класса Thread или реализации runnable, как мы создаем поток?

В вашем примере вы создали анонимный подкласс Thread; то есть класс, который расширяет Thread.

3 голосов
/ 20 июня 2011

Нет, Thread, который не может быть собран сборщиком мусора до завершения основного потока ВМ (независимо от того, является ли поток ОС или нет) завершенным. Я не уверен в том, что Thread, который не имеет каких-либо очевидных ссылок на него, но не был start(), закончился тем, что вызвал утечку, или ее можно собрать - последнее, я бы ожидать.

Что касается вашего второго вопроса - ваш код расширяет , расширяет Thread, используя анонимный внутренний класс, здесь:

new Thread() {
        public void run() {
                foo();
                System.out.print(x + ", ");
        } 
}

Я бы лично предположил, что даже если вы действительно захотите использовать здесь анонимный внутренний класс, обычно лучше реализовать Runnable:

new Thread(new Runnable() {
    public void run() {
        foo();
        System.out.print(x + ", ");
    } 
})

Таким образом, ясно, что вы просто предоставляете что-то для запуска, а не пытаетесь изменить какое-либо поведение ядра потока.

1 голос
/ 20 июня 2011

Ваш поток будет доступен для сборки мусора после его завершения.Конец вашего цикла for не влияет на него, поскольку цикл for выполняется в другом потоке.

В ответ на ваш второй вопрос вы расширяете класс Thread, реализуяВаша собственная run() функция

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