java - 多线程与 CachedThreadPool
问题描述
我有服务器-客户端通信架构,其中有一台服务器和 150 个客户端服务器-客户端通信通过 java NIO 发生,其中所有客户端每 10 秒发送一些或其他数据。以前我们是把所有的进程消息都排队,然后在一个线程中处理,因为客户端的数量越来越多,所以服务器不能立即处理所有的消息,轮流处理数据有延迟失利。所以我想到了实现 CachecThreadPool 以在任务到来时同时处理它们,我选择了 CachedThreadPool 而不是 FixedThreadPool 因为这些任务是短暂的并且数量很多,下面是它的代码。从客户端接收消息的线程在收到消息后ProcessorClass.processData(message)
立即调用。
public class ProcessorClass{
private static final Logger LOGGER = Logger.getLogger(ProcessorClass.class);
static ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
public static void processData(StringBuffer message) {
Runnable task = new Runnable() {
@Override
public void run() {
try {
LOGGER.info("Queue size:"+executor.getQueue().size());
if (message != null){
processMessage(message);
}
}
catch(Exception e) {
LOGGER.error("Error happened in run() method" + e.getMessage());
}
}
};
executor.execute(task);
}
public static void processMessage(StringBuffer message){
// all the processing of message such as DB operations goes here.
}
}
疑点:
1.How CachedThreadPool stores the message in the queue because i haven't defined any explicitly.
2.Should i chose FixedThreadPool over this?
3.Should i make my processMessage() method synchronized?
欢迎所有的建议和评论意见。
解决方案
CachedThreadPool 如何将消息存储在队列中,因为我没有明确定义。
CachedThreadPool 不会将您的消息存储在队列中。getQueue
获取您提交到队列的任务。
我应该选择 FixedThreadPool 吗?
CachedThreadPool
更灵活,因为它会增加和减少它的线程数。问题是它可能会增长太多并导致OOM。FixedThreadPool 不会增长或缩小,但如果您知道自己在做什么,它通常就足够了。提示:进行监视和分析以确定您需要多少线程。
我应该让我的 processMessage() 方法同步吗?
在不知道该方法的实现细节的情况下,我们无法建议您是否需要同步它。该方法肯定需要是线程安全的,但如果您只是简单地添加synchronized
该方法,我预计性能会比您仅在 1 个线程上运行所有内容时更差。
推荐阅读
- python - PyQt5 与 Qtablewidget 程序崩溃无任何异常
- xaml - ListView Tapped 删除数据模板 Xamarin.Forms 上的 StackLayout 背景颜色
- react-native - 如何在本机反应中显示底部导航上方的组件?
- c# - 在控制台应用程序中使用秒表
- github-api - 为什么 Github api 不只提供受保护的分支?
- spring-boot - 如何在java中将base64转换为MultipartFile
- html - 右不工作,但左在位置:绝对;
- encoding - 为什么在编码为 H264 时会丢失 PTS 信息?
- javascript - Flask - Javascript 和 CSS 未正确呈现
- amazon-web-services - 通过 AWS Step Functions 调用 AWS Lambda?