Index: trunk/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java	(revision 11443)
+++ trunk/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java	(revision 11444)
@@ -84,5 +84,12 @@
         job = pollFirst(timeout, unit);
         if (job != null) {
-            acquireSemaphore(job);
+            try {
+                boolean gotLock = tryAcquireSemaphore(job, timeout, unit);
+                return gotLock ? job : null;
+            } catch (InterruptedException e) {
+                // acquire my got interrupted, first offer back what was taken
+                offer(job);
+                throw e;
+            }
         }
         return job;
@@ -96,5 +103,11 @@
         }
         job = takeFirst();
-        acquireSemaphore(job);
+        try {
+            acquireSemaphore(job);
+        } catch (InterruptedException e) {
+            // acquire my got interrupted, first offer back what was taken
+            offer(job);
+            throw e;
+        }
         return job;
     }
@@ -176,4 +189,19 @@
     }
 
+    private boolean tryAcquireSemaphore(Runnable job, long timeout, TimeUnit unit) throws InterruptedException {
+        boolean ret = true;
+        if (job instanceof JCSCachedTileLoaderJob) {
+            final JCSCachedTileLoaderJob<?, ?> jcsJob = (JCSCachedTileLoaderJob<?, ?>) job;
+            Semaphore limit = getSemaphore(jcsJob);
+            if (limit != null) {
+                ret = limit.tryAcquire(timeout, unit);
+                if (ret) {
+                    jcsJob.setFinishedTask(() -> releaseSemaphore(jcsJob));
+                }
+            }
+        }
+        return ret;
+    }
+
     private void releaseSemaphore(JCSCachedTileLoaderJob<?, ?> job) {
         Semaphore limit = getSemaphore(job);
