Почему UserThread, работающий с ScheduleExecutorService, не собирает мусор

Пожалуйста, помогите мне найти причину утечки потока в приведенном ниже коде. 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");
  }
}
6
задан Gray 17 May 2012 в 16:08
поделиться