Mercurial > hg > release > thermostat-0.4
changeset 536:797047eb544a
Fix RequestQueue shutdown
Processing loop has a blocking wait, can leave hanging on shutdown. This
interrupts the processing thread during stop to prevent such issues.
reviewed-by: neugens
review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-August/002677.html
author | Jon VanAlten <jon.vanalten@redhat.com> |
---|---|
date | Thu, 16 Aug 2012 14:35:57 -0400 |
parents | 6def633267ae |
children | 0e677821d3d4 |
files | client/command/src/main/java/com/redhat/thermostat/client/command/internal/RequestQueueImpl.java |
diffstat | 1 files changed, 15 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/client/command/src/main/java/com/redhat/thermostat/client/command/internal/RequestQueueImpl.java Thu Aug 16 14:35:55 2012 -0400 +++ b/client/command/src/main/java/com/redhat/thermostat/client/command/internal/RequestQueueImpl.java Thu Aug 16 14:35:57 2012 -0400 @@ -50,7 +50,8 @@ private final BlockingQueue<Request> queue; private final ConfigurationRequestContext ctx; - private boolean processing; + private volatile boolean processing; + private Thread runningThread; RequestQueueImpl(ConfigurationRequestContext ctx) { processing = false; @@ -63,21 +64,30 @@ queue.add(request); } - void startProcessingRequests() { - if (!processing) { + synchronized void startProcessingRequests() { + if (!running()) { processing = true; new QueueRunner().start(); } } - void stopProcessingRequests() { - processing = false; + synchronized void stopProcessingRequests() { + if (running()) { + processing = false; + runningThread.interrupt(); + runningThread = null; + } + } + + private boolean running() { + return runningThread != null && runningThread.isAlive(); } private class QueueRunner extends Thread { @Override public void run() { + runningThread = Thread.currentThread(); while (processing) { Request request = null; try {