我们如何在 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.Executorjava.util.concurrent.ExecutorServicejava.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
    }
}