X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.maps%2Fsrc%2Forg%2Fsimantics%2Fmaps%2Fpojo%2FTileJob.java;fp=org.simantics.district.maps%2Fsrc%2Forg%2Fsimantics%2Fmaps%2Fpojo%2FTileJob.java;h=1d7ad914e93b4a1ae6b6ef48253cea0487d177c3;hb=4570313c2a06c99dfea43efdb235a093da5b2324;hp=6ed930d42419be86c004aeb12517272f84a8c0f2;hpb=f182477cd4a4b38ed51fd17dc810b8114d0fe6ca;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.maps/src/org/simantics/maps/pojo/TileJob.java b/org.simantics.district.maps/src/org/simantics/maps/pojo/TileJob.java index 6ed930d4..1d7ad914 100644 --- a/org.simantics.district.maps/src/org/simantics/maps/pojo/TileJob.java +++ b/org.simantics.district.maps/src/org/simantics/maps/pojo/TileJob.java @@ -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> queue = new LinkedList>(); - 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> 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 unfinished = executor.shutdownNow(); + LOGGER.warn("TileJob did not terminate in time - left jobs {}", unfinished); + } + } catch (InterruptedException e) { + } + } + }