private void cleanThreadMap() {
   if (closing) {
     return;
   }
   Thread[] copy = threadMap.keySet().toArray(new Thread[threadMap.size()]);
   for (Thread t : copy) {
     if (!t.isAlive()) {
       ConnectionHolder ch = threadMap.remove(t);
       if (ch != null) {
         ch.close();
       }
     } else {
       ConnectionHolder ch = threadMap.get(t);
       if (ch != null && ch.hasExpired()) {
         ch = threadMap.remove(t);
         if (ch != null) {
           ch.close();
         }
       }
     }
   }
 }