gpt4 book ai didi

java - 如有必要,等待结果

转载 作者:行者123 更新时间:2023-11-30 01:38:37 25 4
gpt4 key购买 nike

我正在创建一个网页,其中包含一些动态生成的图像。

在我的页面请求处理中,我创建所有图像并将它们存储在内存缓存中,直到浏览器随后请求它们。

public class CachedImage
{
byte[] data;
Date created;
}

目前,我的图像缓存本质上是 HashMap<Integer, CachedImage> .

问题是图像生成需要时间,我想在所有图像完成生成之前开始渲染页面。

所以我想在线程池中生成图像,并在收到请求时返回数据(如果准备好)或等待数据准备好然后返回。

有人能为这个机制想出一个简洁的模型吗?

图像很小,我对目前将整个图像缓存在内存中的方法感到满意。

最佳答案

生成页面时,为页面将显示的每个图像选择一个新的唯一标识符。这可能很简单,比如通过递增 AtomicInteger 获得的数字。 ,或者可能是更复杂的东西,例如 UUID,以防止用户猜测其他用户的图像 URL。将这些唯一标识符放入客户端将用于检索图像的 URL 中。

选择图像的标识符后,构建一个将生成并返回图像的 Callable,并将其提交到 ThreadPoolExecutor异步运行。这会返回 Future可用于检索结果。将 future 保存在 map 中,以图像的标识符作为键。

稍后,当客户端请求图像时,您可以获取图像标识符并在映射中查找它以找到关联的 Future 对象。对 Future 调用 get() 将返回图像,并在必要时等待生成器完成。 (如果在 map 中找不到请求的标识符,则返回 404 错误。)

为了避免旧图像填满服务器内存,您可能希望在几分钟后丢弃它们。为此,每次创建任务并将其 Future 存储到可用图像映射中时,您可以将任务放入 DelayQueue 中。经过一段适当的延迟后,这将从 map 中删除该条目。使用守护线程从该队列中获取项目并在循环中对它们进行操作。

从 map 中删除 Future 时,最好对 Future 调用 cancel(true) ,以防生成器由于某种原因仍在运行。 (否则,即使图像无论如何都不再可访问,它将继续运行。)

关于java - 如有必要,等待结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1878680/

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