From 83c3152b5d2d51b1f601953bcbbce987e4112659 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sun, 29 Mar 2015 13:40:04 +0000
Subject: [PATCH] JobQueue: Don't start thread in constructor (ticket #973)

---
 router/java/src/net/i2p/router/JobQueue.java   | 18 ++++++++++++++----
 .../java/src/net/i2p/router/RouterContext.java |  1 +
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java
index bc34d6e879..214ebd7194 100644
--- a/router/java/src/net/i2p/router/JobQueue.java
+++ b/router/java/src/net/i2p/router/JobQueue.java
@@ -125,6 +125,9 @@ public class JobQueue {
      */
     private final Object _runnerLock = new Object();
     
+    /** 
+     *  Does not start the pumper. Caller MUST call startup.
+     */
     public JobQueue(RouterContext context) {
         _context = context;
         _log = context.logManager().getLog(JobQueue.class);
@@ -143,16 +146,12 @@ public class JobQueue {
         _context.statManager().createRateStat("jobQueue.jobWait", "How long does a job sit on the job queue?", "JobQueue", new long[] { 60*60*1000l, 24*60*60*1000l });
         //_context.statManager().createRateStat("jobQueue.jobRunnerInactive", "How long are runners inactive?", "JobQueue", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
 
-        _alive = true;
         _readyJobs = new LinkedBlockingQueue<Job>();
         _timedJobs = new TreeSet<Job>(new JobComparator());
         _jobLock = new Object();
         _queueRunners = new ConcurrentHashMap<Integer,JobQueueRunner>(RUNNERS);
         _jobStats = new ConcurrentHashMap<String,JobStats>();
         _pumper = new QueuePumper();
-        I2PThread pumperThread = new I2PThread(_pumper, "Job Queue Pumper", true);
-        //pumperThread.setPriority(I2PThread.NORM_PRIORITY+1);
-        pumperThread.start();
     }
     
     /**
@@ -329,6 +328,17 @@ public class JobQueue {
         runQueue(RUNNERS);
     }
     
+    /** 
+     *  Start the pumper.
+     *  @since 0.9.19
+     */
+    public void startup() {
+        _alive = true;
+        I2PThread pumperThread = new I2PThread(_pumper, "Job Queue Pumper", true);
+        //pumperThread.setPriority(I2PThread.NORM_PRIORITY+1);
+        pumperThread.start();
+    }
+
     /** @deprecated do you really want to do this? */
     public void restart() {
         synchronized (_jobLock) {
diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java
index fd5c657759..efc0036fae 100644
--- a/router/java/src/net/i2p/router/RouterContext.java
+++ b/router/java/src/net/i2p/router/RouterContext.java
@@ -181,6 +181,7 @@ public class RouterContext extends I2PAppContext {
         }
         _clientMessagePool = new ClientMessagePool(this);
         _jobQueue = new JobQueue(this);
+        _jobQueue.startup();
         _inNetMessagePool = new InNetMessagePool(this);
         _outNetMessagePool = new OutNetMessagePool(this);
         _messageHistory = new MessageHistory(this);
-- 
GitLab