java - 我们如何在 Jetty 中“禁用”线程池
问题描述
可以将 Jetty Server 配置为不使用线程池,而是每次都创建/终止线程吗?起初我想创建一个简单的ThreadPool
类,但它看起来不像......
我们知道这对性能不是很好,我们正在接受它。
解决方案
提醒:Jetty 是一个 100% 异步服务器,绝对没有每 1 个请求 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 上下文、线程上下文、线程本地,并且可能会破坏 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
}
}
推荐阅读
- excel - 应用过滤器后数据透视图更改图表类型
- postgresql - 在 Windows 上复制的 Postgresql 权限被拒绝
- python-3.x - 如何使用 selenium 向下滚动 instagram 中的弹出关注者列表?(Python)
- email - 向 example.com 发送电子邮件是否会导致电子邮件发送服务被列入黑名单或其他问题?
- swift - 如何在 SwiftUI 中将文本推送到边缘
- r - 是否可以删除堆叠条边界线?
- python - detect.tflite v1 对同一对象失去信心( Python )
- discord.py - discord py - 在嵌入中实现贴纸
- reactjs - Ant Design:警告:[antd: Upload] `transformFile` 已弃用。请直接使用`beforeUpload` :ReactJs
- c# - 如何在 Visual Studio(社区)的 C# 中打开语法错误突出显示?