首页 > 解决方案 > 我们如何在 Jetty 中“禁用”线程池

问题描述

可以将 Jetty Server 配置为不使用线程池,而是每次都创建/终止线程吗?起初我想创建一个简单的ThreadPool类,但它看起来不像......

我们知道这对性能不是很好,我们正在接受它。

标签: javaembedded-jetty

解决方案


提醒:Jetty 是一个 100% 异步服务器,绝对没有每 1 个请求 1 个线程的关系。单个请求每个请求使用 1..n 个线程是很常见的。每个请求的线程数取决于您所做的技术选择(协议选择、API 选择、Servlet 选择、第 3 方库选择等)。示例:在使用 Servlet 异步处理、Servlet 异步 I/O、HTTP/2 等内容时,您将使用更多线程...

这将是最小的“无池线程池”(一个可怕的概念,实际上会消耗更多内存并将您的 GC 利用率提高几个数量级)。

下面的这个线程池实现是个坏主意。

不要在生产服务器中使用

别说我没警告过你。

这个线程池不尊重 和 的基本原理java.util.concurrent.Executorjava.util.concurrent.ExecutorService并且java.util.concurrent.ThreadFactory会导致随机组件出现问题:类加载器上下文、java SecurityManager 上下文、线程上下文、线程本地,并且可能会破坏 3rd 方集成,如 spring、jsp、security、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
    }
}

推荐阅读