diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index e70f04bbf..4c0aed0fa 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -64,6 +64,7 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; import java.util.logging.Logger; @@ -7122,13 +7123,21 @@ final class TimeoutTimer implements Runnable { private volatile Future task; private static final ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() { - private final ThreadGroup tg = new ThreadGroup(threadGroupName); - private final String threadNamePrefix = tg.getName() + "-"; + private final AtomicReference tgr = new AtomicReference<>(); private final AtomicInteger threadNumber = new AtomicInteger(0); @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(tg, r, threadNamePrefix + threadNumber.incrementAndGet()); + public Thread newThread(Runnable r) + { + ThreadGroup tg = tgr.get(); + + if (tg == null || tg.isDestroyed()) + { + tg = new ThreadGroup(threadGroupName); + tgr.set(tg); + } + + Thread t = new Thread(tg, r, tg.getName() + "-" + threadNumber.incrementAndGet()); t.setDaemon(true); return t; }