java - 绑定(bind)到服务器资源的线程池

标签 java multithreading tomcat servlets pool

我有一个 Java servlet,它使用重量级且线程不安全的资源来处理用户请求。资源是需要很长时间(最多10秒)实例化并占用大量内存的对象。 但是当分配对象时,需要很短的时间来运行它的方法我需要处理一个请求。

可以有多个这样的资源,彼此不同。 每个请求都带有一个 ID,它指出了特定的资源。 我希望实现一个这样的资源池,这样具有相同 ID 的请求将不会实例化一个新对象,而是从池中选择一个。

方案如下:

  • 收到请求后,servlet检查资源池中是否有请求ID的资源
  • 如果没有,servlet 会创建一个并提供它
  • 如果资源已经实例化,则请求进入队列执行,doPost 等待它。

对不同资源的操作必须是并发的,但在同一资源内是同步的。

我是 Java 中多线程的新手,ThreadPoolExecutor 似乎不能按原样使用,因此我将不胜感激如何实现上述方案的建议。谢谢。

最佳答案

你是对的 - ThreadPoolExecutor 不是你想要的。它只是一个用于运行任务的线程池,而不是共享资源集合。

你想要的是一个缓存。它需要创建一个资源并将其返回给请求线程使用,并重复使用它之前返回的东西。此外,返回的资源必须是线程安全的(因此,如果您的底层资源不是,您可能需要为它们编写同步包装器)。

周围有许多线程安全的缓存,其中相当一部分是开源的。尝试一下,为您的用例配置它们应该不会太难(这看起来很典型)。

实现自己的临时缓存是可能的,而且不太困难,但如果您不熟悉多线程,最好使用第三方解决方案。

关于java - 绑定(bind)到服务器资源的线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23893793/

相关文章:

c++ - "Bad file descriptor"在子线程中访问套接字描述符时

java - 无法在Windows中使用bat文件启动tomcat

spring - 如何使用嵌入式 tomcat session 集群设置 Spring Boot 应用程序?

tomcat - Sesame API 调用抛出 IOException

c++ - PThread - 尽管调用了 pthread_join,但线程提前退出

java - java getter 是线程安全的吗?

Java拆分函数读取一个字符后的空格为空字符串

java - 跳过运行 for 循环

java - 从 Tomcat 服务器上的文件夹运行脚本

java - 上传位于 jar 内的文件