gpt4 book ai didi

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

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

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

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

方案如下:

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

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

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

最佳答案

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

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

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

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

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

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