package org.gephi.visualization.scheduler; import java.util.concurrent.Semaphore; /** * * @author mbastian */ public abstract class AbstractAnimator extends Thread { //Runnable protected final Runnable runnable; //Flag protected boolean animating = true; //Lock protected final Semaphore semaphore; public AbstractAnimator(Runnable runnable, Semaphore semaphore, String name) { super(name); this.semaphore = semaphore; this.runnable = runnable; setDaemon(true); } @Override public void run() { while (animating) { synchronized (this) { try { wait(); } catch (InterruptedException e) { throw new RuntimeException(e); } } runnable.run(); semaphore.release(); } } public final void shutdown() { animating = false; synchronized (this) { notify(); } } public final boolean isAnimating() { return animating; } }