diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterGroup.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterGroup.java index 9baaef339d..216663a759 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterGroup.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterGroup.java @@ -18,9 +18,11 @@ package org.apache.zeppelin.interpreter; import java.util.LinkedList; +import java.util.List; import java.util.Properties; import java.util.Random; +import org.apache.log4j.Logger; import org.apache.zeppelin.display.AngularObjectRegistry; /** @@ -71,14 +73,50 @@ public class InterpreterGroup extends LinkedList{ } public void close() { - for (Interpreter intp : this) { - intp.close(); + List closeThreads = new LinkedList(); + + for (final Interpreter intp : this) { + Thread t = new Thread() { + public void run() { + intp.close(); + } + }; + + t.start(); + closeThreads.add(t); + } + + for (Thread t : closeThreads) { + try { + t.join(); + } catch (InterruptedException e) { + Logger logger = Logger.getLogger(InterpreterGroup.class); + logger.error("Can't close interpreter", e); + } } } public void destroy() { - for (Interpreter intp : this) { - intp.destroy(); + List destroyThreads = new LinkedList(); + + for (final Interpreter intp : this) { + Thread t = new Thread() { + public void run() { + intp.destroy(); + } + }; + + t.start(); + destroyThreads.add(t); + } + + for (Thread t : destroyThreads) { + try { + t.join(); + } catch (InterruptedException e) { + Logger logger = Logger.getLogger(InterpreterGroup.class); + logger.error("Can't close interpreter", e); + } } } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java index 77df7c51d8..57e2b7a6a9 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java @@ -546,13 +546,26 @@ public class InterpreterFactory { public void close() { + List closeThreads = new LinkedList(); synchronized (interpreterSettings) { - synchronized (interpreterSettings) { - Collection intpsettings = interpreterSettings.values(); - for (InterpreterSetting intpsetting : intpsettings) { - intpsetting.getInterpreterGroup().close(); - intpsetting.getInterpreterGroup().destroy(); - } + Collection intpsettings = interpreterSettings.values(); + for (final InterpreterSetting intpsetting : intpsettings) { + Thread t = new Thread() { + public void run() { + intpsetting.getInterpreterGroup().close(); + intpsetting.getInterpreterGroup().destroy(); + } + }; + t.start(); + closeThreads.add(t); + } + } + + for (Thread t : closeThreads) { + try { + t.join(); + } catch (InterruptedException e) { + logger.error("Can't close interpreterGroup", e); } } }