Continuable.java

有这么一个函数:
[code]
public void increase(String key) {
int val = storage.get(key);
storage.put(key, val + 1);
}
[/code]
我需要有一系列的key需要操作,那么就必须弄一个循环:
[code]
for (String key : keys) {
increase(key);
}
[/code]
如果storage是一个网络上的设备,key又非常多。这就会造成非常多次的网络操作。假设有500个key,每次网络操作是100ms。那么就需要耗费500 * 0.1 * 2 = 100秒的时间。
那么怎么解决这个问题呢?最直观的想法就是批量:
[code]
public void increase(Collection<String> keys) {
Map<String, Integer> vals = storage.get(keys);
for (Map.Entry<String, Integer> entry : vals) {
entry.setValue(entry.getValue() + 1);
}
storage.put(vals);
}
[/code]
但是这样做的问题是所有使用increase的地方也必须是批量处理的了。底层的一个优化扩散到了最上层,使得整体的逻辑变复杂了。
最后的解决办法是:
[code]
public interface Storage {
Continuable<Integer> get(String key);
Continuable<Void> put(String key, String value);
}
public Continuable<Void> increase(final String key) {
return new Continuable<Void>(){
private Future<String> val;
protected void step1() {
val = $yield(storage.get(key));
}
protected void step2() {
$yield(storage.put(val.get() + 1));
}
protected void step3() {
$return();
}
};
}
[/code]
而Continuable.java实现的就是$return和$yield,把一个完整的函数打散成step来执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值