@Override
 public void run(List<Plan> plans, Map<String, Object> choices) {
   /*
    * create and submit tasks
    */
   PlanModFutureTask[] tasks = new PlanModFutureTask[plans.size()];
   for (int i = 0; i < plans.size(); i++) {
     PlanModRunnable r = new PlanModRunnable(choices, plans.get(i));
     PlanModFutureTask t = new PlanModFutureTask(r);
     executor.execute(t);
     tasks[i] = t;
   }
   /*
    * wait for completion
    */
   for (int i = 0; i < tasks.length; i++) {
     try {
       tasks[i].get();
     } catch (InterruptedException e) {
       e.printStackTrace();
     } catch (ExecutionException e) {
       e.printStackTrace();
     }
   }
 }
 public void finalize() {
   try {
     super.finalize();
   } catch (Throwable e) {
     e.printStackTrace();
   }
   executor.shutdown();
 }