package org.herac.tuxguitar.util;
public class TGSynchronizer {
private static TGSynchronizer instance;
private TGSynchronizerController controller;
private TGSynchronizer(){
super();
}
public static TGSynchronizer instance(){
if (instance == null) {
synchronized (TGSynchronizer.class) {
instance = new TGSynchronizer();
}
}
return instance;
}
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;
}
public class TGSynchronizerTask{
private Throwable throwable;
private TGRunnable runnable;
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;
}
}
}
public interface TGRunnable {
public void run() throws Throwable;
}
public interface TGSynchronizerController{
public void execute(TGSynchronizerTask task);
public void executeLater(TGSynchronizerTask task);
}
}