From 7f740a0cd4a55b24809adeb1549e9ab96c95e758 Mon Sep 17 00:00:00 2001 From: "bre..om" Date: Tue, 25 Sep 2012 18:51:54 +0000 Subject: [PATCH] TerrainGrid executor now prints out any exceptions from the threads git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9776 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../jme3/terrain/geomipmap/TerrainGrid.java | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/engine/src/terrain/com/jme3/terrain/geomipmap/TerrainGrid.java b/engine/src/terrain/com/jme3/terrain/geomipmap/TerrainGrid.java index 2adc15abb..adb02ac45 100644 --- a/engine/src/terrain/com/jme3/terrain/geomipmap/TerrainGrid.java +++ b/engine/src/terrain/com/jme3/terrain/geomipmap/TerrainGrid.java @@ -46,13 +46,20 @@ import com.jme3.terrain.Terrain; import com.jme3.terrain.heightmap.HeightMap; import com.jme3.terrain.heightmap.HeightMapGrid; import java.io.IOException; +import java.lang.Thread.UncaughtExceptionHandler; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.Callable; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -458,15 +465,42 @@ public class TerrainGrid extends TerrainQuad { return terrain.getMaterial(worldLocation); } + /** + * This will print out any exceptions from the thread + */ protected ExecutorService createExecutorService() { - return Executors.newSingleThreadExecutor(new ThreadFactory() { + final ThreadFactory threadFactory = new ThreadFactory() { public Thread newThread(Runnable r) { Thread th = new Thread(r); - th.setName("jME Terrain Thread"); + th.setName("jME TerrainGrid Thread"); th.setDaemon(true); return th; } - }); + }; + ThreadPoolExecutor ex = new ThreadPoolExecutor(1, 1, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(), + threadFactory) { + protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + if (t == null && r instanceof Future) { + try { + Future future = (Future) r; + if (future.isDone()) + future.get(); + } catch (CancellationException ce) { + t = ce; + } catch (ExecutionException ee) { + t = ee.getCause(); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); // ignore/reset + } + } + if (t != null) + t.printStackTrace(); + } + }; + return ex; } @Override