【问题标题】:Pool of threads tied to resources on the server与服务器上的资源相关联的线程池
【发布时间】:2014-05-27 15:51:49
【问题描述】:

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

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

方案如下:

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

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

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

【问题讨论】:

    标签: java multithreading tomcat servlets pool


    【解决方案1】:

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

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

    周围有许多线程安全的缓存,其中不少 - 开源。尝试一下,为您的用例配置它们应该不会太难(这似乎很典型)。

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

    【讨论】:

    • 如果你自己实现这个,那么 ConcurrentHashMap 将是一个很好的起点
    • 如果我想重用现有的解决方案,什么是好的选择? :)
    • 嗯,有一些内置的解决方案——比如对于大型查询,Hibernate 有一个可配置的缓存,对于到数据库的连接,你有连接池。目前使用的通用缓存是 Ehcache 我相信,虽然我还没有尝试过。
    猜你喜欢
    • 2010-11-29
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2011-07-14
    相关资源
    最近更新 更多