gpt4 book ai didi

java - servlet中多线程调用缓存是否存在线程耗尽风险?

转载 作者:行者123 更新时间:2023-11-28 22:11:59 25 4
gpt4 key购买 nike

我有以下代码,在这里缩写:

 public final void doPost(HttpServletRequest request,
HttpServletResponse response) {

int itemCount = itemsToGetFromCache.size();
ExecutorService service = null;
List<Future<?>> futures = null;
service = Executors.newFixedThreadPool(itemCount);
futures = new ArrayList<Future<?>>();
for (int i=0; i<itemCount; i++)
{
final int j = i;
Future<?> f = service.submit(new Callable<Void>() {

@Override
public Void call() throws Exception {
getItemFromRemoteCacheIfAvailableAndStoreInMemory(itemsToGetFromCache(j));
return null;
}});
futures.add(f);
}
// wait for all tasks to complete before continuing
for (Future<?> f : futures)
{
try {
f.get();
} catch (Exception e) {
//handle exception
}
}

}

它在 Tomcat 7 中运行。典型的项目大小为 30,典型的并发用户数为 200。有人警告说这可能会导致服务器线程达到极限并拒绝连接。请注意,对删除缓存的调用通常会很简短,大约需要 60 毫秒。

基本上,我只是试图通过并行运行它们来加快对缓存的调用。如果结果不在缓存中,它们将从数据库中提取并随后缓存。

这里有问题吗?我不认为服务器连接池大小与服务器以这种方式生成它们时可以处理的最大线程数有关。我的假设是否正确?还有其他问题吗?

最佳答案

您应该避免为每个请求创建线程池。相反,您可以使用公共(public)线程池。

同样,由于严格的线程上下文切换,6000(200*30) 线程实际上可能会降低性能。

10 线程的性能优于 6000 线程。您可以使用多少人线程取决于各种因素,例如:

  • 核心数
  • 每个线程事件中的阻塞量。

对于Ex,如果数据库连接等正在执行的代码中没有I/O阻塞,那么线程数必须与核心数相同。如果有一定数量的阻塞,您应该测量当某些线程被阻塞时您可以拥有多少线程来保持 CPU 忙碌。

很难猜测要使用多少个线程。您必须衡量程序在各种线程池大小下的执行情况。无论是 10、100 还是 200。使其可配置。当然,有很多线程是不好的。

关于java - servlet中多线程调用缓存是否存在线程耗尽风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31327134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com