@Override
public void run() {
runThread = Thread.currentThread();
LOG.info("Starting runnable {}", name);
List<ListenableFuture<Service.State>> completions = Lists.newArrayList();
for (Service service : services) {
SettableFuture<Service.State> completion = SettableFuture.create();
service.addListener(createServiceListener(completion), Threads.SAME_THREAD_EXECUTOR);
completions.add(completion);
}
Services.chainStart(services.get(0), services.subList(1, services.size()).toArray(new Service[0]));
LOG.info("Runnable started {}", name);
try {
Futures.allAsList(completions).get();
} catch (InterruptedException e) {
LOG.debug("Waiting on latch interrupted {}", name);
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
LOG.error("Exception in service.", e);
throw Throwables.propagate(e);
}
List<Service> reverse = Lists.reverse(services);
Services.chainStop(reverse.get(0), reverse.subList(1, reverse.size()).toArray(new Service[0]));
LOG.info("Runnable stopped {}", name);
}