Keep references to threads and shut them down more properly
diff --git a/src/main/java/com/google/code/gossip/manager/ActiveGossipThread.java b/src/main/java/com/google/code/gossip/manager/ActiveGossipThread.java
index c2168fa..3f3964b 100644
--- a/src/main/java/com/google/code/gossip/manager/ActiveGossipThread.java
+++ b/src/main/java/com/google/code/gossip/manager/ActiveGossipThread.java
@@ -18,7 +18,7 @@
 	

 	private GossipManager _gossipManager;

 	

-	private AtomicBoolean _keepRunning;

+	private final AtomicBoolean _keepRunning;

 

 	public ActiveGossipThread(GossipManager gossipManager) {

 		_gossipManager = gossipManager;

@@ -36,10 +36,12 @@
 				_keepRunning.set(false);

 			}

 		}

-

-		_keepRunning = null;

+		shutdown();

 	}

 	

+	public void shutdown(){

+	  _keepRunning.set(false);

+	}

 	/**

 	 * Performs the sending of the membership list, after we have

 	 * incremented our own heartbeat.

diff --git a/src/main/java/com/google/code/gossip/manager/GossipManager.java b/src/main/java/com/google/code/gossip/manager/GossipManager.java
index a12cf23..ed7a03e 100644
--- a/src/main/java/com/google/code/gossip/manager/GossipManager.java
+++ b/src/main/java/com/google/code/gossip/manager/GossipManager.java
@@ -38,8 +38,10 @@
 	private ExecutorService _gossipThreadExecutor;

 	

 	private Class<? extends PassiveGossipThread> _passiveGossipThreadClass;

+	private PassiveGossipThread passiveGossipThread; 

 	

 	private Class<? extends ActiveGossipThread> _activeGossipThreadClass;

+	private ActiveGossipThread activeGossipThread;

 	

   public GossipManager(Class<? extends PassiveGossipThread> passiveGossipThreadClass,

           Class<? extends ActiveGossipThread> activeGossipThreadClass, String address, int port,

@@ -118,10 +120,10 @@
 		}

     _gossipThreadExecutor = Executors.newCachedThreadPool();

     try {

-      _gossipThreadExecutor.execute(_passiveGossipThreadClass.getConstructor(GossipManager.class)

-              .newInstance(this));

-      _gossipThreadExecutor.execute(_activeGossipThreadClass.getConstructor(GossipManager.class)

-              .newInstance(this));

+      passiveGossipThread = _passiveGossipThreadClass.getConstructor(GossipManager.class).newInstance(this);

+      _gossipThreadExecutor.execute(passiveGossipThread);

+      activeGossipThread = _activeGossipThreadClass.getConstructor(GossipManager.class).newInstance(this);

+      _gossipThreadExecutor.execute(activeGossipThread);

     } catch (InstantiationException | IllegalAccessException | IllegalArgumentException

             | InvocationTargetException | NoSuchMethodException | SecurityException e1) {

       throw new RuntimeException(e1);

@@ -142,6 +144,14 @@
 	 */

 	public void shutdown() {

 		_gossipThreadExecutor.shutdown();

+		passiveGossipThread.shutdown();

+		activeGossipThread.shutdown();

+		try {

+      boolean result = _gossipThreadExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);

+      System.err.println("Terminate retuned " + result);

+    } catch (InterruptedException e) {

+      e.printStackTrace();

+    }

 		_gossipServiceRunning.set(false);

 	}

 }

diff --git a/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java b/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java
index d95acd7..044a7d4 100644
--- a/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java
+++ b/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java
@@ -125,8 +125,13 @@
         _keepRunning.set(false);

       }

     }

+    shutdown();

   }

 	

+  public void shutdown(){

+    _server.close();

+  }

+  

 	/**

 	 * Abstract method for merging the local and remote list.

 	 * @param gossipManager The GossipManager for retrieving the local members and dead members list.

diff --git a/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java b/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java
index eaf77ef..e30f39a 100644
--- a/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java
+++ b/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java
@@ -18,6 +18,15 @@
   
   @Test
   public void test() throws UnknownHostException, InterruptedException{
+    abc();
+  }
+  
+  @Test
+  public void testAgain() throws UnknownHostException, InterruptedException{
+    abc();
+  }
+  
+  public void abc() throws InterruptedException, UnknownHostException{
     GossipSettings settings = new GossipSettings();
     int seedNodes = 3;
     ArrayList<GossipMember> startupMembers = new ArrayList<GossipMember>();
@@ -39,6 +48,6 @@
     }
     for (int i = 0; i < clusterMembers; ++i) {
       clients.get(i).shutdown();
-    }
+    } 
   }
 }