diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadCreator.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/PrivilegedThreadFactory.java similarity index 75% rename from jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadCreator.java rename to jetty-util/src/main/java/org/eclipse/jetty/util/thread/PrivilegedThreadFactory.java index 407e6de80b60..ce3dd7e0d58a 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadCreator.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/PrivilegedThreadFactory.java @@ -20,9 +20,10 @@ import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.function.Supplier; /** - * ThreadCreator + * PrivilegedThreadFactory * * Convenience class to ensure that a new Thread is created * inside a privileged block. This prevents the Thread constructor @@ -32,21 +33,23 @@ * reference the context classloader - and remembers it for the * lifetime of the Thread. */ -class ThreadCreator +class PrivilegedThreadFactory { - interface Factory - { - T newThread(); - } - - static T create(Factory maker) + /** + * Use a Supplier to make a new thread, calling it within + * a privileged block to prevent classloader pinning. + * + * @param newThreadSupplier a Supplier to create a fresh thread + * @return a new thread, protected from classloader pinning. + */ + static T newThread(Supplier newThreadSupplier) { return AccessController.doPrivileged(new PrivilegedAction() { @Override public T run() { - return maker.newThread(); + return newThreadSupplier.get(); } }); } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java index 2f61081e5fac..c4a37f850c3c 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java @@ -687,7 +687,7 @@ private boolean addCounts(int deltaThreads, int deltaIdle) @Override public Thread newThread(Runnable runnable) { - return ThreadCreator.create(() -> + return PrivilegedThreadFactory.newThread(() -> { Thread thread = new Thread(_threadGroup, runnable); thread.setDaemon(isDaemon()); diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ShutdownThread.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ShutdownThread.java index 98f109e9b3ca..f870ee93efe7 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ShutdownThread.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ShutdownThread.java @@ -38,7 +38,7 @@ public class ShutdownThread extends Thread { private static final Logger LOG = Log.getLogger(ShutdownThread.class); - private static final ShutdownThread _thread = ThreadCreator.create(() -> + private static final ShutdownThread _thread = PrivilegedThreadFactory.newThread(() -> { return new ShutdownThread(); });