gpt4 book ai didi

java - 在 Brian Goetz 的 Java 并发实践中

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:59 24 4
gpt4 key购买 nike

Brian Goetz 的 Java Concurrency In Practice 提供了一个用于并发使用的高效可伸缩缓存示例。这是该类的代码:

public class Memoizer<A, V> implements Computable<A, V> {
private final ConcurrentMap<A, Future<V>> cache
= new ConcurrentHashMap<A, Future<V>>();
private final Computable<A, V> c;

public Memoizer(Computable<A, V> c) { this.c = c; }

public V compute(final A arg) throws InterruptedException {
while (true) {
Future<V> f = cache.get(arg);
if (f == null) {
Callable<V> eval = new Callable<V>() {
public V call() throws InterruptedException {
return c.compute(arg);
}
};
FutureTask<V> ft = new FutureTask<V>(eval);
f = cache.putIfAbsent(arg, ft);
if (f == null) { f = ft; ft.run(); }
}
try {
return f.get();
} catch (CancellationException e) {
cache.remove(arg, f);
} catch (ExecutionException e) {
throw launderThrowable(e.getCause());
}
}
} }

可能是个愚蠢的问题,但有人能告诉我这个类的并发用法吗?就像在一个主要的?

干杯,阿加塔

最佳答案

这是一个计算阶乘的例子:

public static void main(String[] args) throws Exception {

//create a memoizer that performs factorials
final Memoizer<Integer, Integer> memo = new Memoizer<Integer, Integer> (new Computable<Integer, Integer>() {
@Override
public Integer compute(Integer a) {
int result = 1 ;
for(int i = 1 ; i < a ; i++){
result = result*i;
}
return result;
}
});

//now call the memoizer
System.out.println(memo.compute(10));


//call it with 10 threads concurrently
ExecutorService exec = Executors.newFixedThreadPool(10);
ExecutorCompletionService<Integer> compService = new ExecutorCompletionService<Integer>(exec);
for(int i = 0 ; i < 15 ; i++){
compService.submit(new Callable<Integer>(){
@Override
public Integer call() throws Exception {
return memo.compute(5);
}
});
}
exec.shutdown();
for(int i = 0 ; i < 15 ; i++){
System.out.println(compService.take().get());
}
}

因此,如果两个线程试图同时计算同一个阶乘,则只有其中一个会实际执行计算,因为 putIfAbsent 是线程安全的。第二个线程将简单地获取第一个线程放入映射中的 future 并等待它完成。

关于java - 在 Brian Goetz 的 Java 并发实践中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886485/

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