Index: trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 17653)
+++ trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 17654)
@@ -81,4 +81,6 @@
     private boolean recurseDownAppended = true;
 
+    private ExecutorService exec;
+
     /**
      * Constructs a {@code MultiFetchServerObjectReader}.
@@ -320,9 +322,9 @@
         int threadsNumber = Config.getPref().getInt("osm.download.threads", OsmApi.MAX_DOWNLOAD_THREADS);
         threadsNumber = Utils.clamp(threadsNumber, 1, OsmApi.MAX_DOWNLOAD_THREADS);
-        final ExecutorService exec = Executors.newFixedThreadPool(
+        exec = Executors.newFixedThreadPool(
                 threadsNumber, Utils.newThreadFactory(getClass() + "-%d", Thread.NORM_PRIORITY));
         CompletionService<FetchResult> ecs = new ExecutorCompletionService<>(exec);
         List<Future<FetchResult>> jobs = new ArrayList<>();
-        while (!toFetch.isEmpty()) {
+        while (!toFetch.isEmpty() && !isCanceled()) {
             jobs.add(ecs.submit(new Fetcher(type, extractIdPackage(toFetch), progressMonitor)));
         }
@@ -358,4 +360,5 @@
             }
         }
+        exec = null;
     }
 
@@ -706,3 +709,10 @@
         }
     }
+
+    @Override
+    public void cancel() {
+        super.cancel();
+        if (exec != null)
+            exec.shutdownNow();
+    }
 }
