相关疑难解决方法(0)

计算地图:提前计算价值

我有一个计算映射(带有软值),我用它来缓存昂贵的计算结果.

现在我有一种情况,我知道在接下来的几秒钟内可能会查找一个特定的密钥.该密钥的计算成本也比大多数都要高.

我想在最小优先级线程中提前计算该值,以便在最终请求该值时,它已经被缓存,从而缩短了响应时间.

这样做的好方法是:

  1. 我可以控制执行计算的线程(特别是它的优先级).
  2. 避免重复工作,即仅进行一次计算.如果计算任务已经在运行,那么调用线程会等待该任务而不是再次计算该值(FutureTask实现这一点.使用Guava的计算映射,如果你只调用get它,那么这是真的,但如果你将它与调用混合,则不是put.)
  3. "预先计算值"方法是异步的和幂等的.如果计算已在进行中,则应立即返回,而不等待该计算完成.
  4. 避免优先级倒置,例如,如果高优先级线程在中等优先级线程执行不相关的操作时请求该值,但计算任务在低优先级线程上排队,则高优先级线程不能被饿死.也许这可以通过临时提升计算线程的优先级和/或在调用线程上运行计算来实现.

如何在所涉及的所有线程之间进行协调?


附加信息
我的应用程序中的计算是图像过滤操作,这意味着它们都是CPU绑定的.这些操作包括仿射变换(范围从50μs到1ms)和卷积(最多10ms).当然,不同线程优先级的有效性取决于操作系统抢占较大任务的能力.

java concurrency memoization guava

12
推荐指数
1
解决办法
920
查看次数

标签 统计

concurrency ×1

guava ×1

java ×1

memoization ×1