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
*/
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() {
}
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);
}
}
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) {
+ }
+ }
+
}