package htsjdk.samtools.cram.paralell; import htsjdk.samtools.util.Log; import java.util.concurrent.atomic.AtomicBoolean; abstract class Job implements Runnable { private static Log log = Log.getInstance(Job.class); private AtomicBoolean stop = new AtomicBoolean(false); private AtomicBoolean done = new AtomicBoolean(false); private Exception exception; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Exception getException() { return exception; } public void stop() { log.info("Job done: " + getClass().getName() + ", name: " + getName()); stop.set(true); } public boolean isDone() { return done.get(); } @Override public void run() { log.info("Starting job: " + getClass().getName() + ", name: " + getName()); while (!stop.get()) { try { doRun(); Thread.yield(); } catch (Exception e) { e.printStackTrace(); stop(); } } done.set(true); log.info("Finished job: " + getClass().getName() + ", name: " + getName()); try { doFinish(); } catch (Exception exception) { exception.printStackTrace(); this.exception = exception; stop(); } } protected abstract void doRun() throws Exception; protected void doFinish() throws Exception { } }