首页 > 解决方案 > 多线程与 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?

欢迎所有的建议和评论意见。

标签: javamultithreadingniojava.util.concurrent

解决方案


CachedThreadPool 如何将消息存储在队列中,因为我没有明确定义。

CachedThreadPool 不会将您的消息存储在队列中。getQueue获取您提交到队列的任务。

我应该选择 FixedThreadPool 吗?

CachedThreadPool更灵活,因为它会增加和减少它的线程数。问题是它可能会增长太多并导致OOM。FixedThreadPool 不会增长或缩小,但如果您知道自己在做什么,它通常就足够了。提示:进行监视和分析以确定您需要多少线程。

我应该让我的 processMessage() 方法同步吗?

在不知道该方法的实现细节的情况下,我们无法建议您是否需要同步它。该方法肯定需要是线程安全的,但如果您只是简单地添加synchronized该方法,我预计性能会比您仅在 1 个线程上运行所有内容时更差。


推荐阅读