Пожалуйста, помогите мне найти причину утечки потока в приведенном ниже коде. TestThread
не собирает мусор даже после завершения run() (проверено из оператора печати консоли) и выхода из основного метода (проверено оператором печати и инструментом профилирования).
Однако TestThread
получает сбор мусора, если он установлен как поток демона, то есть t.setDaemon(true)
. Приведенный ниже код — это всего лишь пример кода, который иллюстрирует проблему в моем приложении. Я пытаюсь использовать какой-то уже существующий класс планирования (который был разработан кем-то другим с помощью ScheduledExecutorService
). Я заметил, что когда я продолжаю планировать несколько Runnable
с классом, созданные потоки никогда не удаляются сборщиком мусора.
public class ThreadTest {
static void runThreadWithExecutor() {
final String name = "TestThread";
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, name);
t.setDaemon(false);
return t;
}
});
ses.schedule(new Runnable() {
@Override
public void run() {
System.out.println("entered " + name);
System.out.println("exiting " + name);
}},
2,
TimeUnit.SECONDS);
}
public static void main(String[] args) throws InterruptedException {
System.out.println("entered main");
runThreadWithExecutor();
Thread.sleep(5000);
System.out.println("exiting main");
}
}