ProjectCacheWarmer: Don't create unnecessary threadpool

The warmer threadpool was never cleaned up. Instead, just use a single
Thread instance, which goes away when it is done running.

Change-Id: I4764a48bd5c4377f6c1e76f06826d5559c2a8067
diff --git a/java/com/google/gerrit/server/project/ProjectCacheWarmer.java b/java/com/google/gerrit/server/project/ProjectCacheWarmer.java
index 66bbcca..10ab746 100644
--- a/java/com/google/gerrit/server/project/ProjectCacheWarmer.java
+++ b/java/com/google/gerrit/server/project/ProjectCacheWarmer.java
@@ -20,8 +20,6 @@
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -50,25 +48,25 @@
           new ScheduledThreadPoolExecutor(
               config.getInt("cache", "projects", "loadThreads", cpus),
               new ThreadFactoryBuilder().setNameFormat("ProjectCacheLoader-%d").build());
-      ExecutorService scheduler = Executors.newFixedThreadPool(1);
+      Thread scheduler =
+          new Thread(
+              () -> {
+                for (Project.NameKey name : cache.all()) {
+                  pool.execute(() -> cache.get(name));
+                }
+                pool.shutdown();
+                try {
+                  pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
+                  log.info("Finished loading project cache");
+                } catch (InterruptedException e) {
+                  log.warn("Interrupted while waiting for project cache to load");
+                }
+              });
+      scheduler.setName("ProjectCacheWarmer");
+      scheduler.setDaemon(true);
 
       log.info("Loading project cache");
-      scheduler.execute(
-          () -> {
-            for (Project.NameKey name : cache.all()) {
-              pool.execute(
-                  () -> {
-                    cache.get(name);
-                  });
-            }
-            pool.shutdown();
-            try {
-              pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
-              log.info("Finished loading project cache");
-            } catch (InterruptedException e) {
-              log.warn("Interrupted while waiting for project cache to load");
-            }
-          });
+      scheduler.start();
     }
   }