java - 用于多线程服务器的 Java CachedThreadPool 与 FixedThreadPool
问题描述
我有一个服务器,它不断地监听客户端连接,并在每次客户端连接以处理该客户端的 I/O 时创建一个新线程。现在,我有多个实现 Runnable 的类,并且在 run 方法中有一个 while 循环,该循环一直持续到客户端关闭。我创建了一个新的 Thread 对象并将 runnable 传递给该对象。我很确定还有其他更有效的方法可以做到这一点。我应该切换到 cachedThreadPool 或 fixedThreadPool 还是其他?
解决方案
Executors#cachedThreadPool
如果未定义客户端的大小,我建议使用。
* Creates a thread pool that creates new threads as needed, but
* will reuse previously constructed threads when they are
* available. These pools will typically improve the performance
* of programs that execute many short-lived asynchronous tasks.
* Calls to {@code execute} will reuse previously constructed
* threads if available. If no existing thread is available, a new
* thread will be created and added to the pool. Threads that have
* not been used for sixty seconds are terminated and removed from
* the cache. Thus, a pool that remains idle for long enough will
* not consume any resources.
* Creates a thread pool that reuses a fixed number of threads
* operating off a shared unbounded queue. At any point, at most
* {@code nThreads} threads will be active processing tasks.
* If additional tasks are submitted when all threads are active,
* they will wait in the queue until a thread is available.
因此,如果您不确定您是否确实需要 5 个线程,则不应使用Executors#fixedThreadPool
.
推荐阅读
- arrays - 尝试使用 typedef 创建二维数组的执行错误
- flutter - Flutter - 分析中的 Log Modal Bottom Sheet screen_view
- node.js - 如何防止 504 并获得客户端响应
- ruby-on-rails - Rails 模型选择字段
- microsoft-graph-api - Microsoft Graph - Sites.Read.All 权限需要管理员同意
- xamarin - 转换为位图后图像变得太像素化 - Xamarin.forms
- c# - 在 lambda 中使用扩展方法时 C# 5.0 ForEach 无效参数错误
- mysql - 尝试将函数的参数作为表中的记录输入后失去与服务器 MySQL 的连接
- javascript - 是否可以在重定向时传递道具?
- performance - 我如何优化 Ansible playbook 关于 ssh 连接的性能