import java.util.concurrent.Semaphore; import info.gridworld.grid.Grid; import info.gridworld.world.World; /** * Extend this world for a step-by-step simulation. Supply a run * method that occasionally calls pause. *

* copyright© 2005 Cay S. Horstmann (http://horstmann.com) * * @author Cay Horstmann */ public abstract class StepWorld extends World implements Runnable { public StepWorld() { init(); } public StepWorld(Grid grid) { super(grid); init(); } public abstract void run(); public void pause(String message) { setMessage(message); pause(); } public void pause() { try { s.acquire(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } public void step() { s.release(); try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } private void init() { setMessage("Click the Step button."); Thread t = new Thread(new Runnable() { public void run() { try { s.acquire(); StepWorld.this.run(); setMessage("Done."); } catch (InterruptedException ex) { // terminate thread } } }); t.start(); } private Semaphore s = new Semaphore(0); }