[REEF-1655] Close the driver restart manager on driver shutdown

  * Make `DriverRuntimeRestartManager` implement `AutoCloseable` to shut down the timer thread;
  * Invoke `.close()` method in `DriverRuntimeStopHandler` on driver shutdown

JIRA:
  [REEF-1655](https://issues.apache.org/jira/browse/REEF-1655)

Pull request:
  This closes #1170
diff --git a/lang/java/reef-common/src/main/java/org/apache/reef/driver/restart/DriverRestartManager.java b/lang/java/reef-common/src/main/java/org/apache/reef/driver/restart/DriverRestartManager.java
index 58c809e..c8f9f24 100644
--- a/lang/java/reef-common/src/main/java/org/apache/reef/driver/restart/DriverRestartManager.java
+++ b/lang/java/reef-common/src/main/java/org/apache/reef/driver/restart/DriverRestartManager.java
@@ -44,15 +44,17 @@
 @DriverSide
 @Private
 @Unstable
-public final class DriverRestartManager implements DriverIdlenessSource {
+public final class DriverRestartManager implements DriverIdlenessSource, AutoCloseable {
+
   private static final String CLASS_NAME = DriverRestartManager.class.getName();
   private static final Logger LOG = Logger.getLogger(CLASS_NAME);
 
+  private final Timer restartCompletedTimer = new Timer(this.getClass().getSimpleName() + ":Timer");
+
   private final DriverRuntimeRestartManager driverRuntimeRestartManager;
   private final Set<EventHandler<DriverRestartCompleted>> driverRestartCompletedHandlers;
   private final Set<EventHandler<DriverRestartCompleted>> serviceDriverRestartCompletedHandlers;
   private final int driverRestartEvaluatorRecoverySeconds;
-  private final Timer restartCompletedTimer = new Timer();
 
   private RestartEvaluators restartEvaluators;
   private DriverRestartState state = DriverRestartState.NOT_RESTARTED;
@@ -335,4 +337,13 @@
         CLASS_NAME + " currently in the process of restart.";
     return new IdleMessage(CLASS_NAME, idleMessage, idleState);
   }
+
+  /**
+   * Close the restart timer.
+   */
+  @Override
+  public void close() {
+    LOG.log(Level.FINER, "Closing restart timer. Final state: {0}", this.state);
+    this.restartCompletedTimer.cancel();
+  }
 }
diff --git a/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/DriverRuntimeStopHandler.java b/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/DriverRuntimeStopHandler.java
index 678a596..d344cf3 100644
--- a/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/DriverRuntimeStopHandler.java
+++ b/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/DriverRuntimeStopHandler.java
@@ -21,6 +21,7 @@
 import org.apache.reef.annotations.audience.DriverSide;
 import org.apache.reef.annotations.audience.Private;
 import org.apache.reef.driver.parameters.ResourceManagerPreserveEvaluators;
+import org.apache.reef.driver.restart.DriverRestartManager;
 import org.apache.reef.exception.DriverFatalRuntimeException;
 import org.apache.reef.runtime.common.driver.api.ResourceManagerStopHandler;
 import org.apache.reef.runtime.common.driver.evaluator.Evaluators;
@@ -44,6 +45,7 @@
 
   private static final Logger LOG = Logger.getLogger(DriverRuntimeStopHandler.class.getName());
 
+  private final DriverRestartManager driverRestartManager;
   private final DriverStatusManager driverStatusManager;
   private final ResourceManagerStopHandler resourceManagerStopHandler;
   private final RemoteManager remoteManager;
@@ -51,13 +53,15 @@
   private final boolean preserveEvaluatorsAcrossRestarts;
 
   @Inject
-  DriverRuntimeStopHandler(
+  private DriverRuntimeStopHandler(
+      @Parameter(ResourceManagerPreserveEvaluators.class) final boolean preserveEvaluatorsAcrossRestarts,
+      final DriverRestartManager driverRestartManager,
       final DriverStatusManager driverStatusManager,
       final ResourceManagerStopHandler resourceManagerStopHandler,
       final RemoteManager remoteManager,
-      final Evaluators evaluators,
-      @Parameter(ResourceManagerPreserveEvaluators.class) final boolean preserveEvaluatorsAcrossRestarts) {
+      final Evaluators evaluators) {
 
+    this.driverRestartManager = driverRestartManager;
     this.driverStatusManager = driverStatusManager;
     this.resourceManagerStopHandler = resourceManagerStopHandler;
     this.remoteManager = remoteManager;
@@ -93,5 +97,7 @@
       LOG.log(Level.WARNING, "Error when closing the RemoteManager", e);
       throw new RuntimeException("Unable to close the RemoteManager.", e);
     }
+
+    this.driverRestartManager.close();
   }
 }