繁体   English   中英

使用CachedThreadPool进行多线程

[英]Multi-threading with 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?

欢迎所有建议和评论。

Executors.newCachedThreadPoolExecutors.newFixedThreadPool都具有相同的线程池实现,只是参数不同。 区别在于它们的线程最小值,最大值,线程终止时间和队列类型。

FixedThreadPool您可以向执行程序服务提交任意数量的任务,但是最大线程数将保持在您指定的级别。 如果您明确希望增加线程数,那么这不是正确的选择。

CachedThreadPool不会限制线程CachedThreadPool的线程数。 它可以增长MAX_VALUE个整数。

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

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

我应该选择FixedThreadPool吗?

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

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

在不知道该方法的实现细节的情况下,我们无法建议您是否需要对其进行同步。 该方法肯定需要是线程安全的,但是如果仅在该方法上添加synchronized ,我希望性能会比仅在1个线程上运行所有方法还要差。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM