线程池绑定到服务器上的资源

时间:2014-05-27 15:51:50

标签: java multithreading tomcat servlets pool

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

可能有几个这样的资源,彼此不同。 每个请求都附带一个ID,指向特定资源。 我希望实现这样的资源池,以便具有相同ID的请求不会实例化新对象,但会从池中选择一个。

该计划如下:

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

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

我不熟悉Java中的多线程,并且ThreadPoolExecutor似乎不能按原样使用,因此我将非常感谢您提供有关如何实现上述方案的建议。感谢。

1 个答案:

答案 0 :(得分:1)

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

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

周围有很多线程安全的缓存,其中很多都是开源的。试试这些,为你的用例配置它们应该太难了(看起来很典型)。

实现自己的make-shift缓存是可能的,也不是太困难,但如果您不熟悉多线程,那么使用第三方解决方案要好得多。

相关问题