package org.herac.tuxguitar.util; public class TGSynchronizer { public interface TGRunnable { public void run() throws Throwable; } public interface TGSynchronizerController { public void execute(TGSynchronizerTask task); public void executeLater(TGSynchronizerTask task); } public class TGSynchronizerTask { private TGRunnable runnable; private Throwable throwable; public TGSynchronizerTask(TGRunnable runnable) { this.runnable = runnable; this.throwable = null; } public Throwable getThrowable() { return this.throwable; } public void run() { try { this.runnable.run(); } catch (Throwable throwable) { this.throwable = throwable; } } } private static TGSynchronizer instance; public static TGSynchronizer instance() { if (instance == null) { synchronized (TGSynchronizer.class) { instance = new TGSynchronizer(); } } return instance; } private TGSynchronizerController controller; private TGSynchronizer() { super(); } public void addRunnable(TGRunnable runnable) throws Throwable { TGSynchronizerTask task = new TGSynchronizerTask(runnable); this.controller.execute(task); if (task.getThrowable() != null) { throw task.getThrowable(); } } public void runLater(TGRunnable runnable) throws Throwable { TGSynchronizerTask task = new TGSynchronizerTask(runnable); this.controller.executeLater(task); if (task.getThrowable() != null) { throw task.getThrowable(); } } public void setController(TGSynchronizerController controller) { this.controller = controller; } }