我有一个服务器-客户端通信体系结构,其中有一个服务器和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?
欢迎所有建议和评论。
答案 0 :(得分:0)
Executors.newCachedThreadPool
和Executors.newFixedThreadPool
都具有相同的线程池实现,只是参数不同。区别在于它们的线程最小值,最大值,线程终止时间和队列类型。
在FixedThreadPool
中,您可以向执行程序服务提交任意数量的任务,但是最大线程数将保持在您指定的级别。如果您明确希望增加线程数,那么这不是正确的选择。
CachedThreadPool
不会限制线程池中的线程数。它可以增长MAX_VALUE个整数。
答案 1 :(得分:0)
CachedThreadPool如何将消息存储在队列中,因为我还没有 明确定义任何内容。
CachedThreadPool不会将您的消息存储在队列中。 getQueue
获取您提交到队列的任务。
我应该为此选择FixedThreadPool吗?
CachedThreadPool
更加灵活,因为它将增加和减少线程数。问题是它可能增长太多并导致OOM。 FixedThreadPool不会增长或缩小,但是如果您知道自己在做什么,通常就足够了。提示:进行监视和性能分析以确定需要多少线程。
我应该使我的processMessage()方法同步吗?
在不知道该方法的实现细节的情况下,我们无法建议您是否需要对其进行同步。该方法肯定需要是线程安全的,但是如果仅在该方法上添加synchronized
,则与仅在1个线程上运行所有内容相比,我希望性能会更差。