]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.maps/src/org/simantics/maps/pojo/TileJob.java
Make background map preference changes apply immediately
[simantics/district.git] / org.simantics.district.maps / src / org / simantics / maps / pojo / TileJob.java
index 6ed930d42419be86c004aeb12517272f84a8c0f2..1d7ad914e93b4a1ae6b6ef48253cea0487d177c3 100644 (file)
@@ -13,14 +13,19 @@ package org.simantics.maps.pojo;
 
 import java.awt.Image;
 import java.util.LinkedList;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.simantics.maps.ProvisionException;
 import org.simantics.maps.query.Query;
 import org.simantics.maps.tile.IFilter;
 import org.simantics.maps.tile.ITileProvider;
 import org.simantics.maps.tile.TileKey;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author Tuukka Lehtonen
@@ -28,9 +33,16 @@ import org.simantics.maps.tile.TileKey;
  */
 public class TileJob implements Runnable {
 
-    LinkedList<Query<TileKey, Image>> queue = new LinkedList<Query<TileKey, Image>>();
-    Executor executor = new ScheduledThreadPoolExecutor(1);
-    ITileProvider provider;
+    private static final Logger LOGGER = LoggerFactory.getLogger(TileJob.class);
+    private static final AtomicInteger counter = new AtomicInteger();
+
+    private LinkedList<Query<TileKey, Image>> queue = new LinkedList<>();
+    private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1, runnable -> {
+        Thread thread = new Thread(runnable, getClass().getSimpleName() + "-" + counter.getAndIncrement());
+        thread.setDaemon(true);
+        return thread;
+    });
+    private ITileProvider provider;
 
     public TileJob() {
     }
@@ -51,6 +63,7 @@ public class TileJob implements Runnable {
                     Image result = doQuery(job.source);
                     job.listener.queryComplete(job, result);
                 } catch (Exception e) {
+                    LOGGER.error("Querying failed for job {}", job, e);
                     job.listener.queryFailed(job, e);
                 }
             }
@@ -112,4 +125,16 @@ public class TileJob implements Runnable {
         this.queue = result;
     }
 
+    public void dispose() {
+        executor.shutdown();
+        try {
+            if (!executor.awaitTermination(100, TimeUnit.MILLISECONDS)) {
+                // this should shutdown for good
+                List<Runnable> unfinished = executor.shutdownNow();
+                LOGGER.warn("TileJob did not terminate in time - left jobs {}", unfinished);
+            }
+        } catch (InterruptedException e) {
+        }
+    }
+
 }