java - Java 线程池是如何工作的?
问题描述
我正在开发一个 IoT 项目,其中设备将数据发送到我们的 Java 应用程序,称为网关适配器 (GA)。在java中,我使用线程池为我们从设备收到的每条消息启动一个新线程。
我有以下线程分配器和可运行线程的代码。
public class ThreadAllocator {
/** The thread pool. */
private ExecutorService executorService = Executors.newWorkStealingPool(1000);
public void allocateThread(IoSession session, String message) {
LOGGER.info("Entering allocateThread");
executorService.execute(new HelperThread(null,session, message));
}
}
public class HelperThread implements Runnable {
private String message;
public HelperThread(String message) {
LOGGER.info("Entering HelperThread");
this.message = message;
}
public void run() {
LOGGER.info("Entering run");
// Process Message
}
}
使用上面的代码,当我通过发送大约 5000 条消息进行负载测试时,我可以在日志文件中看到消息“Entering allocateThread”和“Entering HelperThread”5000 次,但我的 run 方法只执行了 1000 次,这意味着消息“Entering run”在那里日志文件只有 1000 次。因此无法处理其他 4000 条消息。
它是预期的行为“newWorkStealingPool”线程池吗?它只会执行等于其构造函数中提供的数字的任务吗?例如 Executors.newWorkStealingPool( 1000 );
请提出解决方案?我是否缺少一些配置,或者它不是我的场景的正确线程池?那么在这种情况下哪个线程池会正常工作呢?
非常感谢您的帮助。
问候, 克里山
解决方案
推荐阅读
- swift - 在函数中设置变量 swift 5
- python - 如何摆脱 django 中的 configparser.NoOptionError
- javascript - 如何在 React 中添加样式内联
- autohotkey - AutoHotKey 播放/暂停 Youtube
- bluetooth-lowenergy - 网络蓝牙 - 我可以检索设备内所有服务的列表吗?
- java - 扫描输入字符串(例如“eeeeexxxxx”)并一次跳过和处理一个字符
- html - 英雄形象完全没有反应
- javascript - 返回取决于可观察对象的值的最佳和最干净的方法
- cors - 使用“Auth Code Flow + PKCE”时来自令牌端点的 CORS 错误
- openlayers - 如何在 Openlayers 中将 Lon Lat 转换为 Geomtry?