具有CachedThreadPool的多线程

时间:2018-11-22 06:04:17

标签: java multithreading nio java.util.concurrent

我有一个服务器-客户端通信体系结构,其中有一个服务器和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?

欢迎所有建议和评论。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

  

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

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

  

我应该为此选择FixedThreadPool吗?

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

  

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

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