Source:
<code>public InterpreterSettingManager(ZeppelinConfiguration conf, InterpreterOption defaultOption, AngularObjectRegistryListener angularObjectRegistryListener, RemoteInterpreterProcessListener remoteInterpreterProcessListener, ApplicationEventListener appEventListener, ConfigStorage configStorage) throws IOException { this.conf = conf; this.defaultOption = defaultOption; this.interpreterDirPath = Paths.get(conf.getInterpreterDir()); LOGGER.debug("InterpreterRootPath: {}", interpreterDirPath); this.dependencyResolver = new DependencyResolver(conf.getString(ConfVars.ZEPPELIN_INTERPRETER_LOCALREPO)); this.interpreterRepositories = dependencyResolver.getRepos(); this.interpreterGroupOrderList = Arrays.asList(conf.getString(ConfVars.ZEPPELIN_INTERPRETER_GROUP_ORDER).split(",")); this.gson = new GsonBuilder().setPrettyPrinting().create(); this.angularObjectRegistryListener = angularObjectRegistryListener; this.remoteInterpreterProcessListener = remoteInterpreterProcessListener; this.appEventListener = appEventListener; this.recoveryStorage = ReflectionUtils.createClazzInstance( conf.getRecoveryStorageClass(), new Class[] {ZeppelinConfiguration.class, InterpreterSettingManager.class}, new Object[] {conf, this}); this.recoveryStorage.init(); LOGGER.info("Using RecoveryStorage: " + this.recoveryStorage.getClass().getName()); this.lifecycleManager = ReflectionUtils.createClazzInstance( conf.getLifecycleManagerClass(), new Class[] {ZeppelinConfiguration.class}, new Object[] {conf}); LOGGER.info("Using LifecycleManager: " + this.lifecycleManager.getClass().getName()); this.configStorage = configStorage; this.interpreterEventServer = new RemoteInterpreterEventServer(conf, this); this.interpreterEventServer.start(); init(); Runtime.getRuntime() .addShutdownHook( <START> new Thread( <END> () -> { LOGGER.info("Shutting down Zeppelin Server ... "); if (!conf.isRecoveryEnabled()) { close(); } })); }</code><technical_language>this run asynchronously (because new thread) in shutdown hook? is shutdown completely then</technical_language>

Target:
public InterpreterSettingManager(ZeppelinConfiguration conf, InterpreterOption defaultOption, AngularObjectRegistryListener angularObjectRegistryListener, RemoteInterpreterProcessListener remoteInterpreterProcessListener, ApplicationEventListener appEventListener, ConfigStorage configStorage) throws IOException { this.conf = conf; this.defaultOption = defaultOption; this.interpreterDirPath = Paths.get(conf.getInterpreterDir()); LOGGER.debug("InterpreterRootPath: {}", interpreterDirPath); this.dependencyResolver = new DependencyResolver(conf.getString(ConfVars.ZEPPELIN_INTERPRETER_LOCALREPO)); this.interpreterRepositories = dependencyResolver.getRepos(); this.defaultInterpreterGroup = conf.getString(ConfVars.ZEPPELIN_INTERPRETER_GROUP_DEFAULT); this.gson = new GsonBuilder().setPrettyPrinting().create(); this.angularObjectRegistryListener = angularObjectRegistryListener; this.remoteInterpreterProcessListener = remoteInterpreterProcessListener; this.appEventListener = appEventListener; this.recoveryStorage = ReflectionUtils.createClazzInstance( conf.getRecoveryStorageClass(), new Class[] {ZeppelinConfiguration.class, InterpreterSettingManager.class}, new Object[] {conf, this}); this.recoveryStorage.init(); LOGGER.info("Using RecoveryStorage: " + this.recoveryStorage.getClass().getName()); this.lifecycleManager = ReflectionUtils.createClazzInstance( conf.getLifecycleManagerClass(), new Class[] {ZeppelinConfiguration.class}, new Object[] {conf}); LOGGER.info("Using LifecycleManager: " + this.lifecycleManager.getClass().getName()); this.configStorage = configStorage; this.interpreterEventServer = new RemoteInterpreterEventServer(conf, this); this.interpreterEventServer.start(); init(); }