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(); } } } } }