我们如何在 Jetty 中 "disable" 线程池
How can we "disable" thread pooling in Jetty
能否将 Jetty 服务器配置为不合并线程,而是每次 create/terminate 一个线程?我起初想创建一个简单的 ThreadPool
class,但它看起来不像...
我们知道这对性能不是很好,我们正在接受它。
提醒:Jetty 是一个 100% 异步服务器,绝对没有 1 个请求一个线程的关系。单个请求通常每个请求使用 1..n 个线程。每个请求的线程数取决于您所做的技术选择(协议选择、API 选择、Servlet 选择、第 3 方库选择等)。示例:在使用 Servlet 异步处理、Servlet 异步 I/O、HTTP/2 等时,您将使用更多线程...
这将是最小的“无池线程池”(一个可怕的概念,实际上会消耗更多内存并将您的 GC 利用率提高几个数量级)。
下面这个线程池实现是个坏主意。
请勿在生产服务器中使用
别说没提醒你
此线程池不遵循 java.util.concurrent.Executor
、java.util.concurrent.ExecutorService
和 java.util.concurrent.ThreadFactory
的基本原理,并且会导致随机组件出现问题:类加载器上下文、java SecurityManager上下文、线程上下文、线程局部变量,并且可能会破坏第 3 方集成,例如 spring、jsp、安全性、jaas、jaspi、cdi、会话存储、会话持久性、ssl 参数、ssl 引擎状态等...
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.thread.ThreadPool;
public class NoThreadPool extends AbstractLifeCycle implements ThreadPool
{
private final Object joinLock = new Object();
@Override
public void execute(Runnable command)
{
Thread thread = new Thread(command);
thread.setName("NoThreadPool"); // name your thread, helps in debugging later
thread.start();
}
@Override
public void join() throws InterruptedException
{
synchronized (joinLock)
{
while (isRunning())
{
joinLock.wait();
}
}
while (isStopping())
{
Thread.sleep(50);
}
}
@Override
protected void doStop() throws Exception
{
super.doStop();
synchronized (joinLock)
{
joinLock.notifyAll();
}
}
@Override
public int getThreads()
{
return 1; // this pool is always in use
}
@Override
public int getIdleThreads()
{
return 100_000; // this pool always has capacity
}
@Override
public boolean isLowOnThreads()
{
return false; // this pool is never low on threads
}
}
能否将 Jetty 服务器配置为不合并线程,而是每次 create/terminate 一个线程?我起初想创建一个简单的 ThreadPool
class,但它看起来不像...
我们知道这对性能不是很好,我们正在接受它。
提醒:Jetty 是一个 100% 异步服务器,绝对没有 1 个请求一个线程的关系。单个请求通常每个请求使用 1..n 个线程。每个请求的线程数取决于您所做的技术选择(协议选择、API 选择、Servlet 选择、第 3 方库选择等)。示例:在使用 Servlet 异步处理、Servlet 异步 I/O、HTTP/2 等时,您将使用更多线程...
这将是最小的“无池线程池”(一个可怕的概念,实际上会消耗更多内存并将您的 GC 利用率提高几个数量级)。
下面这个线程池实现是个坏主意。
请勿在生产服务器中使用
别说没提醒你
此线程池不遵循 java.util.concurrent.Executor
、java.util.concurrent.ExecutorService
和 java.util.concurrent.ThreadFactory
的基本原理,并且会导致随机组件出现问题:类加载器上下文、java SecurityManager上下文、线程上下文、线程局部变量,并且可能会破坏第 3 方集成,例如 spring、jsp、安全性、jaas、jaspi、cdi、会话存储、会话持久性、ssl 参数、ssl 引擎状态等...
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.thread.ThreadPool;
public class NoThreadPool extends AbstractLifeCycle implements ThreadPool
{
private final Object joinLock = new Object();
@Override
public void execute(Runnable command)
{
Thread thread = new Thread(command);
thread.setName("NoThreadPool"); // name your thread, helps in debugging later
thread.start();
}
@Override
public void join() throws InterruptedException
{
synchronized (joinLock)
{
while (isRunning())
{
joinLock.wait();
}
}
while (isStopping())
{
Thread.sleep(50);
}
}
@Override
protected void doStop() throws Exception
{
super.doStop();
synchronized (joinLock)
{
joinLock.notifyAll();
}
}
@Override
public int getThreads()
{
return 1; // this pool is always in use
}
@Override
public int getIdleThreads()
{
return 100_000; // this pool always has capacity
}
@Override
public boolean isLowOnThreads()
{
return false; // this pool is never low on threads
}
}