+ cancel();
+ }
+ submit();
+ }
+
+ protected boolean isRegistered()
+ {
+ return registered.containsKey(getWorker());
+ }
+
+ abstract boolean isWorking();
+
+ protected abstract void submit();
+
+ abstract void cancel();
+ }
+
+ private class SimpleWorkerManager extends WorkerManager
+ {
+ private Future<?> task = null;
+
+ SimpleWorkerManager(AlignCalcWorkerI worker)
+ {
+ super(worker);
+ }
+
+ @Override
+ boolean isWorking()
+ {
+ return task != null && !task.isDone();
+ }
+
+ @Override
+ protected void submit()
+ {
+ if (task != null && !(task.isDone() || task.isCancelled()))
+ {
+ throw new IllegalStateException(
+ "Cannot submit new task if the prevoius one is still running");
+ }
+ Console.debug(
+ format("Worker %s queued", getWorker()));
+ task = executor.submit(() -> {
+ try
+ {
+ Console.debug(format("Worker %s started", getWorker()));
+ getWorker().run();
+ Console.debug(format("Worker %s finished", getWorker()));
+ } catch (InterruptedException e)
+ {
+ Console.debug(format("Worker %s interrupted", getWorker()));
+ } catch (Throwable th)
+ {
+ Console.debug(format("Worker %s failed", getWorker()), th);
+ } finally
+ {
+ if (!isRegistered())
+ {
+ // delete worker reference so garbage collector can remove it
+ worker = null;
+ }