package org.geotoolkit.display2d.container.statefull; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.geotoolkit.display.canvas.Canvas; import org.geotoolkit.display.primitive.SceneNode; /** * Root scene node for statefull context. * Contains an executor pool for parallal data loading. * * @author Johann Sorel (Geomatys) */ public class RootSceneNode extends SceneNode{ /** Executor used to update graphics */ private static final RejectedExecutionHandler LOCAL_REJECT_EXECUTION_HANDLER = new ThreadPoolExecutor.CallerRunsPolicy(){ @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { System.out.println("> Rejected update"); super.rejectedExecution(r, e); } }; private final BlockingQueue queue; private final ThreadPoolExecutor exec; public RootSceneNode(Canvas canvas) { super(canvas,true); queue = new ArrayBlockingQueue(100); exec = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors(), 1, TimeUnit.MINUTES, queue, LOCAL_REJECT_EXECUTION_HANDLER); } protected ThreadPoolExecutor getExecutor(){ return exec; } @Override protected void finalize() throws Throwable { super.finalize(); queue.clear(); exec.shutdown(); } }